連線至媒體應用程式

媒體控制器會與媒體工作階段互動,查詢及控制媒體 播放。在 Media3 中,MediaController API 會實作 Player 介面。使用媒體的用戶端應用程式範例 控制器包括:

在媒體應用程式中,媒體控制器也很實用; 播放器和媒體工作階段位於獨立於 ActivityService 中; 建議您透過 UI 設定 Fragment

建立 MediaController

如要建立 MediaController,請先為SessionToken 對應的 MediaSessionActivityFragmentonStart() 方法是這項操作的理想位置。

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

MediaController 會實作 Player 介面,因此您可以使用介面中定義的指令,控制已連線 MediaSession 的播放作業。也就是說,在 MediaController 上呼叫 play() 會將指令傳送至已連結的 MediaSession,後者隨後會將指令委派給其基礎 Player

同樣地,您可以在控制器中新增 Player.Listener 來監聽 Player 狀態中的變更。詳情請參閱 「玩家事件」指南 進一步瞭解如何使用 Player.ListenerMediaController.Listener 介面會為 連結 MediaSession,例如 onAvailableSessionCommandsChanged() 觸發媒體工作階段變更可用的工作階段指令 onDisconnected()

如同其他元件,請記得在不再需要 MediaController 時釋放,例如在 ActivityFragmentonStop() 方法中。

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

儘管釋出控制器仍會將所有待處理的指令傳送至 而且必須在這些指令執行下列情況時,才與工作階段服務解除繫結 或逾時期限過後 (兩者取其先)。

建立及使用 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());