Bootstrap

Android MediaSession框架简析

一、简介

Google官方在 Android 5.0 引入的媒体应用框架,分为媒体控制器(用于UI)和媒体会话(用于播放器),主要目的是解耦UI和播放器(MediaPlayer、ExoPlayer等)。

controller-and-session

媒体控制器会隔离UI,将控制操作转换为对媒体会话的回调。当会话状态发生变化时,它也会接收来自媒体会话的回调。媒体控制器一次只能连接到一个媒体会话。

媒体会话负责与播放器的所有通信,它会对应用隐藏播放器的API,只能从控制播放器的媒体会话中调用播放器。它可以接收来自一个或多个媒体控制器的回调。

 

二、应用

1. 音频播放

音频应用对UI使用Activity,对播放器使用Service。如果用户切换到其他App,该服务可以在后台运行,响应一些媒体控制事件。通过将音频应用的UI和播放分解为单独的组件,每个组件都可以更高效地独立运行。

é³é¢ Activity å BrowserService

2. 视频播放

视频应用需要一个窗口来查看内容,通常使用单个Activity来实现。由于视频不需要在后台播放,所以不需要MediaBrowser、MediaBrowserService等类。

è§é¢æ­æ¾å¨ Activity

 

三、原理

1. 核心成员类

  • MediaBrowserCompat媒体浏览器客户端类。用于连接MediaBrowserServiceCompat和订阅媒体数据,在回调了连接成功的方法后,通过获取的token得到MediaControllerCompat对象。

  • MediaBrowserServiceCompat浏览器服务服务端类。作为承载实际的播放器和MediaSessionCompat的容器,一般在onCreate()方法中,用setSessionToken(...)来设置token。在重写的onGetRoot(…)方法中判断是否允许连接,在onLoadChildren(…)方法中处理订阅信息。

  • MediaControllerCompat媒体控制器客户端类。可以通过getMetadata()的方式主动获取媒体信息,也可以通过getTransportControls().xxx()的方式发送控制指令,在MediaControllerCompat.Callback中接收媒体的状态,从而刷新界面UI。

  • MediaSessionCompat媒体会话服务端类。通过MediaSessionCompat.Callback来接收MediaControllerCompat发送的指令,然后调用实际的播放器执行相应的操作,如播放、暂停等。在媒体信息或状态发生变化后,通过setMetadata(mediaMetadata)的方式通知客户端,即MediaControllerCompat.Callback中的onMetadataChanged(metadata)方法 。

2. 辅助成员类

  • PlaybackStateCompat: 播放状态类。封装了媒体的各类状态信息,主要是: 状态、进度。

  • MediaMetadataCompat: 构建媒体信息类。主要是:标题、作者、专辑名、总时长等。注意与MediaSessionCompat.QueueItem、MediaBrowserCompat.MediaItem之间的差异。

  • MediaDescriptionCompat: 解析媒体信息类。与MediaMetadataCompat的作用相对应。

3. 连接订阅

4. 数据加载

5. 媒体控制

 

 

参考:

https://developer.android.google.cn/guide/topics/media

https://www.jianshu.com/p/a6c2a3ed842d

https://blog.csdn.net/weixin_42229694/article/details/89315026

https://www.jianshu.com/p/dae43c1eb7ab

;