Обнаружение, если видео было снято в портретной / альбомной ориентации

Я хотел бы подтвердить, что то, что я делаю, действительно правильно, так как некоторые элементы ведут себя неожиданно.

Во-первых, у меня есть альбомная и портретная компоновка, как я понимаю, это автоматически определит, находится ли телефон в портретном / альбомном режиме:

- 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");

    }
}
Другие вопросы по тегам