MediaSession框架

本文详细介绍了Android 5.0引入的MediaSession框架,包括其功能、应用场景和与MediaController的关系。MediaSession用于处理媒体控制器、音量键、媒体按钮交互,允许系统UI获取媒体信息。MediaController作为媒体控制器,可用于监视和控制媒体回放。文章还讨论了蓝牙播放信息显示、MediaButton响应优先级、锁屏显示和播放优化等问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值