web-dev-qa-db-ja.com

exoplayerを使用して横長でビデオを全画面で再生する方法

Exoplayerを使用して、AndroidアプリでURLからビデオを再生します。ポートレートでは、アクティビティ内のビューページャー、フラグメント、タブを使用)すべてが機能します。ユーザーが横向きの場合、動画のみが横向きで再生され、他のすべての詳細は消えて、縦向きの場合は元のレイアウトに戻ります。これを達成するにはどうすればよいですか?またはこれを達成する最良の方法は何ですか?サンプルコードをいただければ幸いです。

Video to be play when portrait

14
scalp007

私は初心者なので、これが私が助けることができる最高です、Exoplayer Demoアプリケーションでこれをテストした後、私はexoplayerの高さを600pxに変更し、このコードを適用して完全に機能しました。

このコードを追加して、画面の向きを検出します

  @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();

アクションまたはタイトルバーを非表示にする必要があることを忘れていました。このコードが役立つことを望み、上記のコード内にこれらのコードを追加します。また、getSupportActionBarコードを機能させるには、アクティビティをAppCompatActivityに拡張する必要があると思います.

if(getSupportActionBar()!=null) {
   getSupportActionBar().hide();
}
//To show the action bar
if(getSupportActionBar()!=null) {
   getSupportActionBar().show();
 }

また、これはプロジェクト全体をフルスクリーンに設定するのに役立ち、ステータスバーを非表示にするなど、画面の向きに基づいてonConfigurationChanged内に追加する必要があります。

ランドスケープで

ExoPlayerActivity.this.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN || View.SYSTEM_UI_FLAG_IMMERSIVE);

PORTRAITでフルスクリーンを終了するには

ExoPlayerActivity.this.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);

コードを編集し、View.SYSTEM_UI_FLAG_IMMERSIVEを追加して、ユーザーがビデオのコントロールボタンをクリックしたときにステータスバーが表示されないようにしました。

9
Daiwik Dan

プレーヤーの設定中に方向を確認し、それに応じてパラメーターを設定できます。

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();
2
Lior Michelzon

データバインディングと私の孤独:

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

私のプロジェクト ここ

1

ハードウェアボタンのある画面では、他のビューがExoPlayerのPlayerViewと画面を共有していない場合、デフォルトで画面全体に表示されます。ただし、画面に仮想ボタンがあるデバイスの場合、画面全体に表示されるわけではありません。私の場合、この行をPlayerViewに追加することで問題が修正されました。

ads:resize_mode="fill"

アクティビティレイアウトにadmob広告があるため、この行を最上部のRelativeLayoutタグに追加しました。

xmlns:ads="http://schemas.Android.com/apk/res-auto"

私はそれが意味をなさないことを知っていますが、Android:resize_mode="fill"はgradle構築エラーを与えます。

また、システムUIを削除してさらにスペースを確保することもできます。

    @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 をご覧ください。

1
solid

プレーヤービューの長さと幅は、ランドスケープモードで親と一致するように設定してください。

  1. これを使用して、ステータスバーを非表示にします:getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

  2. これを使用して、ナビゲーションバーを非表示にします:getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);

1
NocTurn

ここで、より明白な答えが欠けていると思います。 layout-landディレクトリに新しいレイアウトファイルを作成するだけで、ランドスケープモードのときに新しいレイアウトファイルが適用されます。

この新しいレイアウトファイルで、ExoPlayerlayout_heightmatch_parentに変更するだけで、画面全体に表示されます。

0
Jin