Xamarin Android开发MediaSession.SetMetadata蓝牙设备不生效原因求解
问题原因及修复方案
1. 高版本Android未正确配置MediaSession标识
你当前的代码仅在Android 8.0以下系统添加了MediaSessionCompat.FlagHandlesMediaButtons和MediaSessionCompat.FlagHandlesTransportControls两个标识,实际上Android 8.0及以上版本的蓝牙设备同样需要这两个标识才能正常同步媒体元数据,删除版本判断,全局添加这两个标识即可。
修改后的InitMediaSession对应代码:
// 删掉if (Build.VERSION.SdkInt < BuildVersionCodes.O)的判断,直接设置Flags MediaSession.SetFlags(MediaSessionCompat.FlagHandlesMediaButtons | MediaSessionCompat.FlagHandlesTransportControls);
2. 元数据更新后未同步更新播放状态
绝大多数车载蓝牙设备不会单独监听元数据变更事件,需要你在更新元数据后,同时发送一次播放状态更新,才会触发元数据的拉取逻辑,哪怕当前播放状态没有变化,也需要重新设置一次PlaybackStateCompat。
你可以在UpdateMetadata方法末尾添加如下代码:
// 示例:如果当前是播放状态就发送播放状态,暂停同理 var stateBuilder = new PlaybackStateCompat.Builder() .SetActions(PlaybackStateCompat.ActionPlay | PlaybackStateCompat.ActionPause | PlaybackStateCompat.ActionSkipToNext | PlaybackStateCompat.ActionSkipToPrevious) .SetState(PlaybackStateCompat.StatePlaying, PlaybackStateCompat.PlaybackPositionUnknown, 1.0f); MediaSession.SetPlaybackState(stateBuilder.Build());
3. 元数据键值使用不兼容
你当前代码使用的是原生MediaMetadata的键值,部分蓝牙设备对MediaSessionCompat的适配要求使用兼容包下的键值,修改为MediaMetadataCompat的对应键值即可:
metadataBuilder.PutString(MediaMetadataCompat.MetadataKeyTitle, title) .PutString(MediaMetadataCompat.MetadataKeyArtist, artist);
4. 未将MediaSession绑定到媒体通知
如果你的应用使用了MediaStyle样式的播放通知,需要确保调用了SetMediaSession方法将MediaSession的Token绑定到通知上,蓝牙设备会从系统媒体通知通道关联的MediaSession拉取元数据:
var notificationBuilder = new NotificationCompat.Builder(this, CHANNEL_ID) .SetStyle(new AndroidX.Media.App.NotificationCompat.MediaStyle() .SetMediaSession(MediaSession.SessionToken)) // 其余通知配置 ;
内容的提问来源于stack exchange,提问作者Jose Santos
相关产品推荐
相关产品推荐

