Android 13通知栏媒体按钮无法触发PlaybackState回调求助
解决Android 13中MediaPlayer通知栏跳转按钮异常问题
确认MediaSessionCompat激活状态:Android 13对会话激活状态校验更严格,必须在MediaPlayer准备完成后调用
MediaSessionCompat.setActive(true),销毁时调用setActive(false),未激活的会话无法触发回调。完善PlaybackState动作配置:构建PlaybackState时必须明确添加跳转动作,示例代码:
val playbackState = PlaybackStateCompat.Builder() .setActions( PlaybackStateCompat.ACTION_PLAY or PlaybackStateCompat.ACTION_PAUSE or PlaybackStateCompat.ACTION_SKIP_TO_NEXT or PlaybackStateCompat.ACTION_SKIP_TO_PREVIOUS ) .setState(PlaybackStateCompat.STATE_PLAYING, currentPosition, 1.0f) .build() mediaSession.setPlaybackState(playbackState)校验Service配置与权限:
- 在AndroidManifest.xml中声明API 31+要求的媒体前台权限:
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA" /> - Service启动模式设为
START_STICKY或START_NOT_STICKY,且必须调用startForeground()将媒体通知设为前台通知,Android 13不允许后台Service处理媒体控件交互。
- 在AndroidManifest.xml中声明API 31+要求的媒体前台权限:
调整MediaControllerCompat注册时机:需在MediaSessionCompat创建并激活后再注册回调,避免会话未就绪导致绑定失败,示例:
mediaSession = MediaSessionCompat(this, "MediaPlayerSession") mediaSession.setActive(true) val controller = MediaControllerCompat(this, mediaSession.sessionToken) controller.registerCallback(object : MediaControllerCompat.Callback() { override fun onPlaybackStateChanged(state: PlaybackStateCompat?) { // 处理播放状态变更 } override fun onMediaButtonEvent(mediaButtonEvent: Intent?): Boolean { // 兜底处理按钮事件 return super.onMediaButtonEvent(mediaButtonEvent) } })检查通知渠道配置:Android 13要求媒体通知使用
IMPORTANCE_DEFAULT及以上的渠道,且渠道类型设为NotificationChannel.DEFAULT_CHANNEL_ID_MEDIA,确保通知可正常响应交互。添加按钮事件兜底逻辑:若PlaybackState回调仍未触发,可在Service的
onStartCommand中直接拦截跳转意图手动处理,排查会话绑定问题:override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { intent?.action?.let { when(it) { MediaButtonReceiver.ACTION_SKIP_TO_NEXT -> { // 手动执行下一曲逻辑 } MediaButtonReceiver.ACTION_SKIP_TO_PREVIOUS -> { // 手动执行上一曲逻辑 } } } return START_STICKY }
内容的提问来源于stack exchange,提问作者صلي علي محمد - Atef Farouk
相关产品推荐
相关产品推荐

