一、简介
Google官方在 Android 5.0 引入的媒体应用框架,分为媒体控制器(用于UI)和媒体会话(用于播放器),主要目的是解耦UI和播放器(MediaPlayer、ExoPlayer等)。
![Android MediaSession框架简析_第1张图片](http://img.e-com-net.com/image/info8/632ab7598f464e6a8dd69827e4adca10.jpg)
媒体控制器会隔离UI,将控制操作转换为对媒体会话的回调。当会话状态发生变化时,它也会接收来自媒体会话的回调。媒体控制器一次只能连接到一个媒体会话。
媒体会话负责与播放器的所有通信,它会对应用隐藏播放器的API,只能从控制播放器的媒体会话中调用播放器。它可以接收来自一个或多个媒体控制器的回调。
二、应用
1. 音频播放
音频应用对UI使用Activity,对播放器使用Service。如果用户切换到其他App,该服务可以在后台运行,响应一些媒体控制事件。通过将音频应用的UI和播放分解为单独的组件,每个组件都可以更高效地独立运行。
![Android MediaSession框架简析_第2张图片](http://img.e-com-net.com/image/info8/38f9a223dcdc4936a2d4b19cf18ed1c8.jpg)
2. 视频播放
视频应用需要一个窗口来查看内容,通常使用单个Activity来实现。由于视频不需要在后台播放,所以不需要MediaBrowser、MediaBrowserService等类。
![Android MediaSession框架简析_第3张图片](http://img.e-com-net.com/image/info8/e21e6ea590c245cab85e86a171f1710b.png)
三、原理
1. 核心成员类
- MediaBrowserCompat:媒体浏览器,客户端类。用于连接MediaBrowserServiceCompat和订阅媒体数据,在回调了连接成功的方法后,通过获取的token得到MediaControllerCompat对象。
![Android MediaSession框架简析_第4张图片](http://img.e-com-net.com/image/info8/c73d843d38e34b98939fdbad7d39abad.jpg)
- MediaBrowserServiceCompat:浏览器服务,服务端类。作为承载实际的播放器和MediaSessionCompat的容器,一般在onCreate()方法中,用setSessionToken(...)来设置token。在重写的onGetRoot(…)方法中判断是否允许连接,在onLoadChildren(…)方法中处理订阅信息。
![Android MediaSession框架简析_第5张图片](http://img.e-com-net.com/image/info8/4fa01144b78f4bc794cb60eed58b5082.jpg)
- MediaControllerCompat:媒体控制器,客户端类。可以通过getMetadata()的方式主动获取媒体信息,也可以通过getTransportControls().xxx()的方式发送控制指令,在MediaControllerCompat.Callback中接收媒体的状态,从而刷新界面UI。
![Android MediaSession框架简析_第6张图片](http://img.e-com-net.com/image/info8/af7d377ed26846f98ef45c61d8bb6f5a.jpg)
- MediaSessionCompat:媒体会话,服务端类。通过MediaSessionCompat.Callback来接收MediaControllerCompat发送的指令,然后调用实际的播放器执行相应的操作,如播放、暂停等。在媒体信息或状态发生变化后,通过setMetadata(mediaMetadata)的方式通知客户端,即MediaControllerCompat.Callback中的onMetadataChanged(metadata)方法 。
![Android MediaSession框架简析_第7张图片](http://img.e-com-net.com/image/info8/5a7724e3ad1845508043f1a89766b0a4.jpg)
2. 辅助成员类
- PlaybackStateCompat: 播放状态类。封装了媒体的各类状态信息,主要是: 状态、进度。
![Android MediaSession框架简析_第8张图片](http://img.e-com-net.com/image/info8/4f5b9c6ab9504152bd32e33b923f21b5.jpg)
- MediaMetadataCompat: 构建媒体信息类。主要是:标题、作者、专辑名、总时长等。注意与MediaSessionCompat.QueueItem、MediaBrowserCompat.MediaItem之间的差异。
![Android MediaSession框架简析_第9张图片](http://img.e-com-net.com/image/info8/9c7b58ec5e4a44ebb6d29e2ac2f7adab.jpg)
- MediaDescriptionCompat: 解析媒体信息类。与MediaMetadataCompat的作用相对应。
![Android MediaSession框架简析_第10张图片](http://img.e-com-net.com/image/info8/33114d248472432cbcd0520c58f19f95.jpg)
3. 连接订阅
![Android MediaSession框架简析_第11张图片](http://img.e-com-net.com/image/info8/ab3cf972dd1f41fd93a9d36afb05fc0d.jpg)
4. 数据加载
![Android MediaSession框架简析_第12张图片](http://img.e-com-net.com/image/info8/c6e761b39ab44224821d100925bd4ad7.jpg)
5. 媒体控制
![Android MediaSession框架简析_第13张图片](http://img.e-com-net.com/image/info8/fb6bfa45610349bfa64331f952ad9009.jpg)
参考:
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