メディアを再生するアプリには、メディアの表示や再生の制御を行うためのユーザー インターフェース コンポーネントが必要です。Media3 ライブラリには、多くの UI コンポーネントを含む UI モジュールが含まれています。UI モジュールに依存するには、次の依存関係を追加します。
Kotlin
implementation("androidx.media3:media3-ui:1.3.1")
Groovy
implementation "androidx.media3:media3-ui:1.3.1"
最も重要なコンポーネントは、メディア再生のビューである PlayerView
です。PlayerView
は、再生中の動画、字幕、アルバムアートに加え、再生コントロールを表示します。
PlayerView
には、プレーヤー インスタンスを(null
をバイパスで)アタッチおよび切断するための setPlayer
メソッドがあります。
プレーヤー ビュー
PlayerView
は、動画と音声の再生の両方に使用できます。動画再生の際には動画と字幕をレンダリングし、音声ファイルにメタデータとして含まれるアートワークを表示できます。他の UI コンポーネントと同様に、レイアウト ファイルに含めることができます。たとえば、PlayerView
は次の XML に含めることができます。
<androidx.media3.ui.PlayerView
android:id="@+id/player_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:show_buffering="when_playing"
app:show_shuffle_button="true"/>
上記のスニペットは、PlayerView
が複数の属性を提供することを示しています。これらの属性を使用して、ビューの動作やデザインをカスタマイズできます。これらの属性のほとんどには、対応するセッター メソッドがあり、実行時にビューをカスタマイズするために使用できます。これらの属性とセッター メソッドの詳細については、PlayerView
Javadoc をご覧ください。
レイアウト ファイルでビューを宣言したら、アクティビティの onCreate
メソッドでそのビューを検索できます。
Kotlin
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // ... playerView = findViewById(R.id.player_view) }
Java
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // ... playerView = findViewById(R.id.player_view); }
プレーヤーが初期化されたら、setPlayer
を呼び出してビューにアタッチできます。
Kotlin
// Instantiate the player. val player = ExoPlayer.Builder(context).build() // Attach player to the view. playerView.player = player // Set the media item to be played. player.setMediaItem(mediaItem) // Prepare the player. player.prepare()
Java
// Instantiate the player. player = new ExoPlayer.Builder(context).build(); // Attach player to the view. playerView.setPlayer(player); // Set the media item to be played. player.setMediaItem(mediaItem); // Prepare the player. player.prepare();
サーフェスのタイプを選択する
PlayerView
の surface_type
属性を使用すると、動画の再生に使用されるサーフェスのタイプを設定できます。値 spherical_gl_surface_view
(球体動画再生用の特別な値)と video_decoder_gl_surface_view
(拡張機能レンダラーを使用した動画レンダリング用)以外に、指定できる値は surface_view
、texture_view
、none
です。ビューが音声再生専用の場合、高コストになる可能性があるため、サーフェスを作成する必要がないように none
を使用する必要があります。
通常の動画再生用のビューの場合は、surface_view
または texture_view
を使用する必要があります。SurfaceView
には、動画再生に関して TextureView
よりも多くの利点があります。
- 多くのデバイスで大幅に消費電力を削減します。
- フレーム時間の精度が向上し、動画の再生がスムーズになります。
- 対応デバイスでの高画質 HDR 動画出力のサポート。
- DRM 保護で保護されたコンテンツの再生時のセキュアな出力をサポートします。
- UI レイヤをアップスケールする Android TV デバイスで、ディスプレイの最大解像度で動画コンテンツをレンダリングする機能。
そのため、可能であれば TextureView
よりも SurfaceView
を優先する必要があります。TextureView
は、SurfaceView
がニーズを満たさない場合にのみ使用してください。一例として、以下のメモで説明するように、Android 7.0(API レベル 24)より前では、動画サーフェスのスムーズなアニメーションまたはスクロールが必要です。この場合、SDK_INT
が 24(Android 7.0)未満の場合にのみ TextureView
を使用し、それ以外の場合は SurfaceView
を使用することをおすすめします。
Android TV の D-pad ナビゲーション
Android TV のリモコンには、Activity
の dispatchKeyEvent(KeyEvent)
にキーイベントとして到着したコマンドを送信する D-pad コントロールがあります。これらはプレーヤー ビューに委任する必要があります。
Kotlin
override fun dispatchKeyEvent(event: KeyEvent?): Boolean{ return playerView.dispatchKeyEvent(event!!) || super.dispatchKeyEvent(event) }
Java
@Override public boolean dispatchKeyEvent(KeyEvent event) { return playerView.dispatchKeyEvent(event) || super.dispatchKeyEvent(event); }
プレーヤー ビューのフォーカスをリクエストすることは、再生コントロールの操作や広告のスキップにとって重要です。Activity
の onCreate
でフォーカスをリクエストすることを検討してください。
Kotlin
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // ... playerView.requestFocus() // ... }
Java
@Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); // ... playerView.requestFocus(); // ... }
Android TV で Compose を使用している場合は、AndroidView
をフォーカス可能にし、それに応じて修飾子パラメータを AndroidView
に渡してイベントを委任する必要があります。
AndroidView(
modifier = modifier
.focusable()
.onKeyEvent { playerView.dispatchKeyEvent(it.nativeKeyEvent) },
factory = { playerView }
)
ドローアブルのオーバーライド
PlayerView
は、PlayerControlView
を使用して再生コントロールと進行状況バーを表示します。PlayerControlView
で使用されるドローアブルは、アプリで定義されている同じ名前のドローアブルでオーバーライドできます。オーバーライドできるコントロール ドローアブルの一覧については、PlayerControlView
Javadoc をご覧ください。
さらなるカスタマイズ
上記以外のカスタマイズが必要な場合は、アプリ デベロッパーは Media3 の UI モジュールで提供される UI コンポーネントではなく、独自の UI コンポーネントを実装することが推奨されます。