You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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处理媒体控件交互。
  • 调整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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 19:13:24