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

Android 12+音乐播放器通知PendingIntent报错,添加FLAG_MUTABLE无效求助

解决Android 12+音乐播放器通知PendingIntent必须指定FLAG_IMMUTABLE/FLAG_MUTABLE的问题

你只给通知主点击的PendingIntent加了FLAG_MUTABLE,但忽略了通知栏操作按钮对应的所有PendingIntent——包括ppreviousIntent、pplayIntent、pnextIntent、pcloseIntent,还有MediaButtonReceiver.buildMediaButtonPendingIntent生成的PendingIntent,这些没处理的才是报错的真正原因。

修复方案:

  1. 先封装一个适配版本的PendingIntent创建工具方法,避免重复写版本判断:
private PendingIntent createPendingIntent(Intent intent, int requestCode, int baseFlags) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
        // 按需选择FLAG_MUTABLE或FLAG_IMMUTABLE,不需要修改Intent内容时用IMMUTABLE更安全
        baseFlags |= PendingIntent.FLAG_MUTABLE;
    }
    return PendingIntent.getBroadcast(this, requestCode, intent, baseFlags);
}
  1. 把所有操作按钮的PendingIntent都用这个方法生成:
    比如上一曲、播放/暂停等功能的Intent,替换成如下写法:
// 上一曲示例
Intent previousIntent = new Intent(this, 你的媒体广播接收器类.class);
previousIntent.setAction("自定义的上一曲动作标识");
ppreviousIntent = createPendingIntent(previousIntent, 1, PendingIntent.FLAG_UPDATE_CURRENT);

// 播放/暂停、下一曲、关闭的Intent按同样逻辑处理
  1. 替换MediaButtonReceiver的默认PendingIntent:
    不要直接用buildMediaButtonPendingIntent,手动构建Intent并添加适配FLAG:
Intent stopIntent = new Intent(MediaButtonReceiver.ACTION_MEDIA_BUTTON);
stopIntent.putExtra(Intent.EXTRA_KEY_EVENT, new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_STOP));
PendingIntent stopPendingIntent = createPendingIntent(stopIntent, 0, PendingIntent.FLAG_UPDATE_CURRENT);

然后把setCancelButtonIntent(stopPendingIntent)替换原来的方法调用。

额外提醒:

  • 若你的PendingIntent不需要后续修改Intent内的内容,优先使用FLAG_IMMUTABLE,安全性更高;仅当需要动态更新Intent数据时才用FLAG_MUTABLE。
  • 检查所有用到PendingIntent的地方,确保都完成了版本适配,不要遗漏任何一处。

内容的提问来源于stack exchange,提问作者Jemis Patel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 02:55:19