連線至媒體應用程式

媒體控制器會與媒體工作階段互動,以便查詢及控制媒體應用程式的播放內容。在 Media3 中,MediaController API 會實作 Player 介面。以下列舉使用媒體控制器的用戶端應用程式:

媒體控制器也在媒體應用程式中也很有用,例如播放器和媒體工作階段位於與 ActivityFragment 分開的 Service 和 UI 時。

建立 MediaController

如要建立 MediaController,請先為對應的 MediaSession 建立 SessionToken。為此,ActivityFragmentonStart() 方法特別適合。

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.Listener,請參閱「玩家事件」指南。MediaController.Listener 介面會為已連線 MediaSession 的事件和傳入指令定義其他回呼,例如 onAvailableSessionCommandsChanged(),用於當媒體工作階段變更可用工作階段指令時,以及控制器與工作階段中斷連線時適用的 onDisconnected()

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

Kotlin

MediaController.releaseFuture(controllerFuture)

Java

MediaController.releaseFuture(controllerFuture);

釋出控制器仍會傳送傳送至工作階段的所有待處理指令,而且只會在這些指令已處理或逾時期間 (兩者取其先) 後與工作階段服務解除繫結。

建立及使用 MediaBrowser

MediaBrowserMediaController 提供的功能為基礎,可讓使用者瀏覽媒體應用程式 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());