Я использую exoplayer для воспроизведения видео с url в приложении для Android. В портрете все работает так, как ожидалось (используя просмотрщик, фрагменты и вкладки внутри действия). Моя цель - воспроизвести видео в полноэкранном режиме, когда пользователь находится в ландшафте. Это означает, что только видео будет воспроизводиться в ландшафте, а все остальные детали исчезнут и вернутся к исходной компоновке при портретной ориентации. Как я могу достичь этого, пожалуйста? или что это лучший способ достичь этого? любой образец кода будет оценен.
Как воспроизводить видео в полноэкранном режиме в ландшафте с использованием экзопланера
Ответ 1
Я noob, так что это лучшее, что я могу вам помочь, btw Я тестировал это в демонстрационном приложении Exoplayer, я изменил высоту exoplayer до 600 пикселей, и я применил этот код, и он отлично работал.
добавьте этот код для определения ориентации экрана
  @Override
  public void onConfigurationChanged(Configuration newConfig) {
  super.onConfigurationChanged(newConfig);
  // Checking the orientation of the screen
  if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
     //First Hide other objects (listview or recyclerview), better hide them using Gone.
     FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) simpleExoPlayerView.getLayoutParams();
     params.width=params.MATCH_PARENT;
     params.height=params.MATCH_PARENT;
     simpleExoPlayerView.setLayoutParams(params);
  } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
     //unhide your objects here.
     FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) simpleExoPlayerView.getLayoutParams();
     params.width=params.MATCH_PARENT;
     params.height=600;
     simpleExoPlayerView.setLayoutParams(params);
  }
}
Кстати, если вы не используете FrameLayout, но RelativeLayout
      RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) simpleExoPlayerView.getLayoutParams();
Я забыл, что вам нужно скрыть действие или строку заголовка, надеюсь, что этот код поможет, добавьте эти коды в код выше, также я думаю, вам нужно будет расширить свою активность до AppCompatActivity для использования кода getSupportActionBar.
if(getSupportActionBar()!=null) {
   getSupportActionBar().hide();
}
//To show the action bar
if(getSupportActionBar()!=null) {
   getSupportActionBar().show();
 }
также это может помочь установить весь проект в полноэкранном режиме, чтобы скрыть строку состояния.etc, необходимо добавить внутри onConfigurationChanged на основе ориентации экрана.
В LandScape
ExoPlayerActivity.this.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN || View.SYSTEM_UI_FLAG_IMMERSIVE);
Чтобы выйти из полноэкранного режима в ПОРТРЕТЕ
ExoPlayerActivity.this.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
Я редактировал код, я добавил View.SYSTEM_UI_FLAG_IMMERSIVE, чтобы предотвратить отображение строки состояния при нажатии пользователем кнопки управления в видео.
Ответ 2
Вы можете проверить ориентацию при установке проигрывателя и соответственно установить параметры:
if (getActivity().getResources().getConfiguration().orientation == 
Configuration.ORIENTATION_LANDSCAPE) {
        params = (LinearLayout.LayoutParams) 
exoPlayerView.getLayoutParams();
        params.width = params.MATCH_PARENT;
        params.height = params.MATCH_PARENT;
        exoPlayerView.setLayoutParams(params);
    }
И скройте панель действий:
((AppCompatActivity) getActivity()).getSupportActionBar().hide();
Ответ 3
Мое решение с привязкой данных:
layout.xml
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
    <import type="android.view.View" />
    <variable
        name="orientationLandscape"
        type="boolean" />
    <variable
        name="step"
        type="com.udacity.zeban.baking.data.models.Step" />
</data>
<android.support.constraint.ConstraintLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <com.google.android.exoplayer2.ui.SimpleExoPlayerView
        android:id="@+id/step_video"
        android:layout_width="match_parent"
        android:layout_height="@dimen/player_height"
        app:layout_constraintBottom_toTopOf="@+id/scroll"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_height="@{orientationLandscape}" />
    <ScrollView
        android:id="@+id/scroll"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/step_video">
        <android.support.v7.widget.CardView
            android:id="@+id/description"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="@dimen/spacing_small"
            android:visibility="@{orientationLandscape ? View.GONE : View.VISIBLE}">
            <TextView
                android:id="@+id/step_description"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_margin="@dimen/spacing_small"
                android:text="@{step.getDescription()}"
                tools:text="@tools:sample/lorem/random" />
        </android.support.v7.widget.CardView>
    </ScrollView>
</android.support.constraint.ConstraintLayout>
и добавьте это в свой файл или фрагмент:
@BindingAdapter("layout_height")
public static void setLayoutHeight(View view, boolean orientationLandscape) {
    view.getLayoutParams().height = orientationLandscape ? RelativeLayout.LayoutParams.MATCH_PARENT : 600;
}
@Override
public void onResume() {
    super.onResume();
    binding.setOrientationLandscape(getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE);
}
Мой проект здесь
Ответ 4
Для экранов с аппаратными кнопками Если никакие другие представления не разделяют экран с PlayerView из ExoPlayer, он по умолчанию заполняет весь экран. Однако для устройств с виртуальными кнопками на экране он не заполняет весь экран. в моем случае проблемы исправлены добавлением этой строки в PlayerView.
ads:resize_mode="fill"
поскольку у меня есть рекламные объявления в макете активности, я добавил эту строку в верхний тег RelativeLayout.
xmlns:ads="http://schemas.android.com/apk/res-auto"
 Я знаю, что это не имеет смысла, однако использование android:resize_mode="fill" даст вам ошибку построения градиента.
также вы можете удалить системный интерфейс для еще большего пространства:
    @Override
public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);
    if (hasFocus) {
        hideSystemUI();
    }
}
private void hideSystemUI() {
    // Enables  "lean back" mode
    // Or for "sticky immersive," replace it with SYSTEM_UI_FLAG_IMMERSIVE_STICKY
    View decorView = getWindow().getDecorView();
    decorView.setSystemUiVisibility(
            // Hide the nav bar and status bar
            View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                    | View.SYSTEM_UI_FLAG_FULLSCREEN);
}
для получения дополнительной информации посетите страницу разработчика Android https://developer.android.com/training/system-ui/immersive
Ответ 5
Обязательно установите длину и ширину вида проигрывателя, чтобы он соответствовал его родителю, в альбомном режиме.
-  Используйте это, чтобы скрыть строку состояния: getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
-  Используйте это, чтобы скрыть панель навигации: getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
Ответ 6
 Я думаю, что мы упускаем более очевидный ответ здесь. Просто создайте новый файл макета в каталоге layout-land чтобы новый файл макета был применен, когда вы находитесь в ландшафтном режиме.
 В этом новом файле макета просто измените свой ExoPlayer layout_height на match_parent чтобы он match_parent весь экран.
Ответ 7
Оформить документацию по методу exoPlayerView Resize здесь
    exoPlayerView.setResizeMode(AspectRatioFrameLayout.RESIZE_MODE_FILL);
    exoPlayerView.setPlayer(exoPlayer);
Это исправило мой случай. Я надеюсь, что это сработает и для вас.
Ответ 8
Вы можете сделать диалог для ландшафтного режима, сначала инициализировать диалог,
private void initFullscreenDialog() {
    mFullScreenDialog = new Dialog(mContext, android.R.style.Theme_Black_NoTitleBar_Fullscreen) {
        public void onBackPressed() {
            if (mExoPlayerFullscreen) {    //mExoPlayerFullscreen is a boolean to check if it is already fullscreen or not
                closeFullscreenDialog();
            }
            super.onBackPressed();
        }
    };
}
Теперь, как показано ниже, вы инициализируете свою полноэкранную кнопку: -
mFullScreenButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (!mExoPlayerFullscreen) {
                ((Activity) mContext).setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);
                openFullscreenDialog();
            } else {
                ((Activity) mContext).setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT);
                closeFullscreenDialog();
            }
        }
    });
затем вы можете открыть и закрыть полноэкранный режим следующим образом:
private void openFullscreenDialog() {
    ((ViewGroup) playerView.getParent()).removeView(playerView);
    mFullScreenDialog.addContentView(playerView, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
    mFullScreenIcon.setImageResource(R.drawable.ic_exit_fullscreen);
    mExoPlayerFullscreen = true;
    mFullScreenDialog.show();
}
private void closeFullscreenDialog() {
    ((ViewGroup) playerView.getParent()).removeView(playerView);
    ((FrameLayout) findViewById(R.id.main_media_frame)).addView(playerView);
    mExoPlayerFullscreen = false;
    mFullScreenDialog.dismiss();
    mFullScreenIcon.setImageResource(R.drawable.ic_fullscreen);
}
Ответ 9
Я добавил в playerView:
app:resize_mode="fixed_width"
И тогда все работает хорошо

