メディア コントローラは、メディア セッションとやり取りしてメディアのクエリと制御を行います
発生します。Media3 の MediaController
API は Player
インターフェースを実装します。メディアを使用するクライアント アプリの例
コントローラには以下が含まれます。
- Android システムのメディア コントロール
- Android Wear OS コンパニオン アプリ
- Android Auto と Automotive OS
- 音声アシスタント(Google アシスタントなど)
- メディア コントローラ テストアプリ
メディア コントローラは、メディアアプリ内でも便利です。たとえば、
プレーヤーとメディア セッションが、Activity
とは別の Service
に存在するか、
UI を使った Fragment
。
MediaController
を作成する
MediaController
を作成するには、まずSessionToken
対応する MediaSession
。Activity
の onStart()
メソッドまたは
Fragment
が適しています。
Kotlin
val sessionToken = SessionToken(context, ComponentName(context, PlaybackService::class.java))
Java
SessionToken sessionToken = new SessionToken(context, new ComponentName(context, PlaybackService.class));
この SessionToken
を使用して MediaController
をビルドすると、
特定のセッションに追加します。この処理は非同期で行われるため、必要な
結果をリッスンし 可能な場合はそれを使用します
Kotlin
val controllerFuture = MediaController.Builder(context, sessionToken).buildAsync() controllerFuture.addListener({ // MediaController is available here with controllerFuture.get() }, MoreExecutors.directExecutor())
Java
ListenableFuture<MediaController> controllerFuture = new MediaController.Builder(context, sessionToken).buildAsync(); controllerFuture.addListener(() -> { // MediaController is available here with controllerFuture.get() }, MoreExecutors.directExecutor());
MediaController
を使用する
MediaController
は Player
インターフェースを実装しているため、コマンドを使用できます。
接続された MediaSession
の再生を制御するためにインターフェースに定義されています。
つまり、MediaController
で play()
を呼び出すと、
コマンドが接続された MediaSession
に送信されるため、
その基盤となる Player
に追加します。
同様に、コントローラに Player.Listener
を追加して、
Player
状態の変化を示します。詳しくは、
プレーヤー イベントのガイド
Player.Listener
の使用に関する詳細をご覧ください。MediaController.Listener
インターフェースは、イベントと受信コマンドに対する
接続先MediaSession
:
onAvailableSessionCommandsChanged()
使用可能なセッション コマンドがメディア セッションによって変更され、
onDisconnected()
コントローラがセッションから切断された時点。
他のコンポーネントと同様に、MediaController
が成功した場合は必ず解放してください。
不要になったり(Activity
の onStop()
メソッドや、
Fragment
。
Kotlin
MediaController.releaseFuture(controllerFuture)
Java
MediaController.releaseFuture(controllerFuture);
コントローラを離しても、API キーに送信されたすべての保留中のコマンドが これらのコマンドの実行後にのみ、セッション サービスからバインド解除されます。 タイムアウト時間が経過したかを判断する必要があります。
MediaBrowser
を作成して使用する
MediaBrowser
は、
MediaController
: メディアが提供するメディア ライブラリのブラウジングも有効にします。
アプリの MediaLibraryService
。
Kotlin
val browserFuture = MediaBrowser.Builder(context, sessionToken).buildAsync() browserFuture.addListener({ // MediaBrowser is available here with browserFuture.get() }, MoreExecutors.directExecutor())
Java
ListenableFuture<MediaBrowser> browserFuture = new MediaBrowser.Builder(context, sessionToken).buildAsync(); browserFuture.addListener(() -> { // MediaBrowser is available here with browserFuture.get() }, MoreExecutors.directExecutor());
メディアアプリのコンテンツ ライブラリのブラウジングを開始するには、まずルートノードを取得します
getLibraryRoot()
の場合:
Kotlin
// Get the library root to start browsing the library tree. val rootFuture = mediaBrowser.getLibraryRoot(/* params= */ null) rootFuture.addListener({ // Root node MediaItem is available here with rootFuture.get().value }, MoreExecutors.directExecutor())
Java
// Get the library root to start browsing the library tree. ListenableFuture<LibraryResult<MediaItem>> rootFuture = mediaBrowser.getLibraryRoot(/* params= */ null); rootFuture.addListener(() -> { // Root node MediaItem is available here with rootFuture.get().value }, MoreExecutors.directExecutor());
次に、メディア ライブラリ内を移動するために、
ライブラリ内の getChildren()
で MediaItem
。たとえば、
ルートノード MediaItem
の子ノード:
Kotlin
// Get the library root to start browsing the library tree. val childrenFuture = mediaBrowser.getChildren(rootMediaItem.mediaId, 0, Int.MAX_VALUE, null) childrenFuture.addListener({ // List of children MediaItem nodes is available here with // childrenFuture.get().value }, MoreExecutors.directExecutor())
Java
ListenableFuture<LibraryResult<ImmutableList<MediaItem>>> childrenFuture = mediaBrowser.getChildren(rootMediaItem.mediaId, 0, Integer.MAX_VALUE, null); childrenFuture.addListener(() -> { // List of children MediaItem nodes is available here with // childrenFuture.get().value }, MoreExecutors.directExecutor());