メディアアプリに接続する

メディア コントローラは、メディア セッションとやり取りして、メディアアプリの再生をクエリして制御します。Media3 では、MediaController API が Player インターフェースを実装します。メディア コントローラを使用するクライアント アプリの例を次に示します。

メディア コントローラは、メディアアプリ内でも便利です。たとえば、プレーヤーとメディア セッションが、UI で Activity または Fragment とは別の Service に存在する場合などです。

MediaController を作成する

MediaController を作成するには、まず、対応する MediaSessionSessionToken を作成します。これには、Activity または FragmentonStart() メソッドが適しています。

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 を使用する

MediaControllerPlayer インターフェースを実装しているため、インターフェースで定義されたコマンドを使用して、接続された MediaSession の再生を制御できます。つまり、MediaControllerplay() を呼び出すと、接続されている MediaSession にコマンドが送信され、その後、コマンドは基盤となる Player に委任されます。

同様に、Player.Listener をコントローラに追加して、Player 状態の変化をリッスンできます。Player.Listener の使用方法については、プレーヤー イベントのガイドをご覧ください。MediaController.Listener インターフェースは、接続された MediaSession からのイベントと受信コマンドに対する追加のコールバックを定義します。たとえば、メディア セッションが使用可能なセッション コマンドを変更したときの onAvailableSessionCommandsChanged()、コントローラがセッションから切断されたときの onDisconnected() などです。

他のコンポーネントと同様に、ActivityFragmentonStop() メソッドなどで、不要になったら忘れずに MediaController を解放してください。

Kotlin

MediaController.releaseFuture(controllerFuture)

Java

MediaController.releaseFuture(controllerFuture);

コントローラを解放しても、セッションに送信された保留中のコマンドはすべて配信され、これらのコマンドが処理された後、またはタイムアウト期間が経過した後にのみ、セッション サービスからバインド解除されます。

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