連線至媒體應用程式

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

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

建立 MediaController

如要建立 MediaController,請先為SessionToken 對應的 MediaSessionActivityonStart() 方法,或 這時「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.ListenerMediaController.Listener 介面會為來自 連結 MediaSession,例如 onAvailableSessionCommandsChanged()敬上 觸發媒體工作階段變更可用的工作階段指令 onDisconnected()

與其他元件一樣,請記得在執行 MediaController 時釋出 MediaController 已不需要,例如 ActivityonStop() 方法或 Fragment

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