問題を再現するサンプルアプリを作成しました。
https://github.com/blundell/VideoRatioProblemPerDevice
VideoViewのドキュメントには次のように記載されています。
ビデオファイルを表示します。...ビデオからの測定値の計算を処理して、任意のレイアウトマネージャーで使用できるようにし、スケーリングなどのさまざまな表示オプションを提供します
問題は、Samsung Galaxy S3がビデオに対して奇妙なことをしていて、ビデオの比率を尊重していないことです。(HTCデバイスでも発生します)。
フルスクリーンフラグメントを使用したアクティビティ:
私が見つけたのは、ビデオがサムスンギャラクシーS3で再生されると、間違った比率で再生されるということです。元のビデオの比率に関係なく、ビューの高さまで引き伸ばされているように見えます。
ここ:
ただし、Samsung Galaxy Nexusでビデオを再生すると、ビデオは正しい比率になります。
ここ:
ビデオにフラグメントのフルサイズを強制的に取り込むと、S3では問題ないように見えます(画面の比率がビデオの比率であるため)。ただし、他の場所、つまりタブレットで使用されているフラグメントを台無しにするため、これは実行したくありません。
コードは次のとおりです。
VideoViewを使用したフラグメントを含むアクティビティ。ここで見ることができます:GITHUB CODE LINK
ここにいくつかのコードが必要な場合は、VideoPlayerFragmentです。
public class VideoPlayerFragment extends Fragment {
private static final String TAG = "VideoPlayer";
private FitVideoView videoView;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View root = inflater.inflate(R.layout.fragment_video_player, container, false);
videoView = (FitVideoView) root.findViewById(R.id.surface);
return root;
}
public void playVideo() {
Uri uri = Uri.parse("android.resource://" + getActivity().getPackageName() + "/" + R.raw.test_vid);
Log.d(TAG, "Uri is: " + uri);
setVideoLocation(uri);
if (!videoView.isPlaying()) {
videoView.start();
}
}
private void setVideoLocation(Uri uri) {
try {
videoView.setVideoURI(uri);
} catch (Exception e) {
Log.e(TAG, "VideoPlayer uri was invalid", e);
Toast.makeText(getActivity(), "Not found", Toast.LENGTH_SHORT).show();
}
}
public void pauseVideo() {
if (videoView.isPlaying()) {
videoView.pause();
}
}
}