媒體控制器會與媒體工作階段互動,查詢及控制媒體
播放。在 Media3 中,MediaController
API 會實作 Player
介面。使用媒體的用戶端應用程式範例
控制器包括:
- Android 系統媒體控制項
- Android Wear OS 隨附應用程式
- Android Auto 和 Automotive OS
- 語音助理,例如 Google 助理
- Media Controller Test 應用程式
在媒體應用程式中,媒體控制器也很實用;
播放器和媒體工作階段位於獨立於 Activity
的 Service
中;
建議您透過 UI 設定 Fragment
。
建立 MediaController
如要建立 MediaController
,請先為SessionToken
對應的 MediaSession
。Activity
的 onStart()
方法,或
這時「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.Listener
。MediaController.Listener
介面會為來自
連結 MediaSession
,例如
onAvailableSessionCommandsChanged()
敬上
觸發媒體工作階段變更可用的工作階段指令
onDisconnected()
。
與其他元件一樣,請記得在執行 MediaController
時釋出 MediaController
已不需要,例如 Activity
的 onStop()
方法或
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());