MediaSession框架
一、MediaSession框架
二、BlueTooth蓝牙播放信息显示
三、MediaButton响应优先级
四、锁屏显示
五、播放优化
MediaSession
1. added in API level 21 (Android 5.0)
2. 允许与媒体控制器、音量键、媒体按钮和传输控制交互。
3. 一般来说,一个应用程序只需要一个会话来进行所有回放,尽管可以创建多个会话来提供更好的媒体控制。
4. 线程安全。
Android 5.0更新了新的媒体播放API和媒体类型通知,使用最新的API可以让系统界面能够读取你的媒体播放并提取和显示专辑封面。
比如在Lolippop上,播放音乐时锁屏界面背景会变成专辑封面,并且还有播放控制按钮。
媒体回放控制
使用新增的通知和媒体 API 可确保系统 UI 了解您的媒体回放情况,并可提取和显示专辑封面。现在,可以利用新增的 MediaSession 类和 MediaController 类更轻松地在整个 UI 和服务范围内控制媒体回放。
新增的 MediaSession 类替代了弃用的 RemoteControlClient 类,仅提供一套回调方法来处理传输控制和媒体按钮。如果您的应用提供媒体回放,并运行在 Android TV 或 Wear 平台上,请使用 MediaSession 类,通过同样的回调方法来处理您的传输控制。
现在,您可以使用新增的 MediaController 类开发自己的媒体控制器应用。该类可通过您的应用的 UI 进程,以线程安全方式监控和控制媒体回放。请在创建控制器时指定一个 MediaSession.Token 对象,以便您的应用可与给定 MediaSession 交互。您可以利用 MediaController.TransportControls 方法,通过发送 play()、stop()、skipToNext() 和 setRating() 等命令来控制该会话上的媒体回放。对于控制器,您还可以注册一个 MediaController.Callback 对象来侦听该会话上的元数据和状态变化。
此外,您还可以利用新增的 Notification.MediaStyle 类创建允许将回放控制与媒体会话绑定的丰富通知。
媒体控件和 RemoteControlClient
RemoteControlClient 类现已弃用。请尽快切换到新的 MediaSession API。
Android 5.0 中的锁定屏幕不会为 MediaSession 或 RemoteControlClient 显示传输控件。不过,您的应用可以通过一个通知从锁定屏幕提供媒体播放控件。这让您的应用可以对媒体按钮的显示进行更多控制,同时为使用锁定设备和未锁定设备的用户提供一致的体验。
为实现此目的,Android 5.0 引入了一个新的 Notification.MediaStyle 模板。Notification.MediaStyle 将您使用 Notification.Builder.addAction() 添加的通知操作转换为精简按钮,嵌入到应用的媒体播放通知中。将您的会话令牌传递到 setSession() 方法以告知系统该通知控制进行中的媒体会话。
请务必将通知的可见性设为 VISIBILITY_PUBLIC,以将通知标记为安全,从而显示在任何锁定屏幕上(以安全方式或其他方式)。如需了解详细信息,请参阅锁定屏幕通知。
要让应用在 Android TV 或 Wear 平台上运行时显示媒体播放控件,则实现 MediaSession 类。如果您的应用需要在 Android 设备上接收媒体按钮事件,您还应实现 MediaSession。
MediaSession、MediaController详细使用参看谷歌官方例子
https://github.com/googlesamples/android-UniversalMusicPlayer
一共用到四个重要的东西
MediaSession
SessionToken
MediaSessionService AndroidSDK\sources\android-23\com\android\server\media\MediaSessionService.java
MediaController
MediaSession 媒体会话
官翻:
一个会话,一般是涉及两方或以上;
在使用MediaSession的情况下,一般有受控端(一个)和控制端(可以有多个)。
Token: 表示一个正在进行的会话。允许创建一个MediaController与之交流 (用于做匹配识别的参数)。
new MediaSession()之后,对象便有了token,getSessionToken()获取。
Callback: 接收媒体按键、来自MediaController传输控制、系统的命令等,外部使用setCallback()设置到mediasession里面去。
QueueItem: 它是mediasession里面播放队列Queue的其中一个元素。有描述字段、Id、可序列化。
MediaSession 简单使用
MediaSessionCompat mSession;
mSession = new MediaSessionCompat(this, "MusicService");
mSession.setCallback(new MediaSessionCompat.Callback());
mSession.setFlags(MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS |
MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS);
//FLAG_HANDLES_MEDIA_BUTTONS 控制媒体按钮
//FLAG_HANDLES_TRANSPORT_CONTROLS 控制传输命令
mSession.setActive(true); //激活
mSession.release(); //退出时需要销毁
更新播放状态和歌曲信息
mSession.setPlaybackState(state); //最重要
mSession.setMetadata(MediaMetadataCompat metadata);
//media_session的服务,可通过命令查看系统当前的服务信息 adb shell dumpsys media_session
MediaMetadataCompat
包含有关项的媒体元数据,如标题、艺术家等。
MediaMetadataCompat metadata = new MediaMetadataCompat.Builder()
.putString(MediaMetadataCompat.METADATA_KEY_TITLE, title)
.putString(MediaMetadataCompat.METADATA_KEY_ARTIST, artist)
.putString(MediaMetadataCompat.METADATA_KEY_ALBUM, album)
.putLong(MediaMetadataCompat.METADATA_KEY_DURATION, durationMs)
.putString(MediaMetadataCompat.METADATA_KEY_MEDIA_ID, id)
.putS