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