媒体控制器与媒体会话交互,以查询和控制媒体
应用播放。在 Media3 中,MediaController
API 实现了 Player
接口。使用媒体的客户端应用示例
控制器包括:
- Android 系统媒体控件
- Android Wear OS 配套应用
- Android Auto 和 Automotive OS
- 语音助理,例如 Google 助理
- 媒体控制器测试应用
媒体控制器在媒体应用中也很有用,例如,在
播放器和媒体会话位于 Service
中,与 Activity
或
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
例如在 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());