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

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

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

MediaController を作成する

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

KotlinJava
val sessionToken = 
  SessionToken(context, ComponentName(context, PlaybackService::class.java))
SessionToken sessionToken = 
  new SessionToken(context, new ComponentName(context, PlaybackService.class));

この SessionToken を使用して MediaController をビルドすると、 特定のセッションに追加します。これは非同期で行われるため、結果をリッスンし、利用可能な場合は使用する必要があります。

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

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

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

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

KotlinJava
MediaController.releaseFuture(controllerFuture)
MediaController.releaseFuture(controllerFuture);

コントローラを離しても、API キーに送信されたすべての保留中のコマンドが これらのコマンドの実行後にのみ、セッション サービスからバインド解除されます。 タイムアウト時間が経過したかを判断する必要があります。

MediaBrowser を作成して使用する

MediaBrowser は、 MediaController: メディアが提供するメディア ライブラリのブラウジングも有効にします。 アプリの MediaLibraryService

KotlinJava
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() の場合:

KotlinJava
// 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 の子ノードを取得するには、次のようにします。

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