Обнаружение, если видео было снято в портретной / альбомной ориентации
Я хотел бы подтвердить, что то, что я делаю, действительно правильно, так как некоторые элементы ведут себя неожиданно.
Во-первых, у меня есть альбомная и портретная компоновка, как я понимаю, это автоматически определит, находится ли телефон в портретном / альбомном режиме:
- layout
- activity_video_player.xml
- layout-land
- activity_video_player.xml
Затем, когда пользователь выбирает видео из галереи, я проверяю, снимал ли видео в альбомной или портретной ориентации, делая это (внутри OnCreate
):
int w;
int h;
MediaMetadataRetriever mediaMetadataRetriever = new MediaMetadataRetriever();
mediaMetadataRetriever.setDataSource(this, videoURI);
String height = mediaMetadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT);
String width = mediaMetadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH);
w = Integer.parseInt(width);
h = Integer.parseInt(height);
if (w > h) {
this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
} else {
this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
Я проверил это, и он работает нормально, но я заметил, что некоторые из моих элементов XML (кнопка воспроизведения) размещены неправильно.
Итак, мой поток приложений:
MainActivity --> SelectvidButton --> Gallery Intent --> VideoPlayActivity
Мой вопрос
Это правильный способ сделать это, и если это так, есть ли причина, по которой некоторые из элементов XML размещаются неправильно?
РЕДАКТИРОВАТЬ 1:
Я заметил, что это происходит только тогда, когда действие запускается впервые, если я нажимаю кнопку "Назад" и снова выбираю то же видео, макет будет таким, каким я его хочу.
РЕДАКТИРОВАТЬ 2:
Я также заметил, что это происходит, только если предыдущее действие (MainActivity) было в той же ориентации, что и выбранное видео.
0 ответов
Вот что я в итоге сделал.
Вместо того, чтобы использовать MediaMetadataRetriever
чтобы получить ширину и высоту, я сначала получаю Bitmap
из видеофайла, а затем установить ориентацию в соответствии с шириной и высотой Bitmap
, как показано ниже:
private void rotateScreen() {
try {
//Create a new instance of MediaMetadataRetriever
MediaMetadataRetriever retriever = new MediaMetadataRetriever();
//Declare the Bitmap
Bitmap bmp;
//Set the video Uri as data source for MediaMetadataRetriever
retriever.setDataSource(this, mVideoUri);
//Get one "frame"/bitmap - * NOTE - no time was set, so the first available frame will be used
bmp = retriever.getFrameAtTime();
//Get the bitmap width and height
videoWidth = bmp.getWidth();
videoHeight = bmp.getHeight();
//If the width is bigger then the height then it means that the video was taken in landscape mode and we should set the orientation to landscape
if (videoWidth > videoHeight) {
//Set orientation to landscape
this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}
//If the width is smaller then the height then it means that the video was taken in portrait mode and we should set the orientation to portrait
if (videoWidth < videoHeight) {
//Set orientation to portrait
this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
} catch (RuntimeException ex) {
//error occurred
Log.e("MediaMetadataRetriever", "- Failed to rotate the video");
}
}