Android 12+音乐播放器通知PendingIntent报错,添加FLAG_MUTABLE无效求助
解决Android 12+音乐播放器通知PendingIntent必须指定FLAG_IMMUTABLE/FLAG_MUTABLE的问题
你只给通知主点击的PendingIntent加了FLAG_MUTABLE,但忽略了通知栏操作按钮对应的所有PendingIntent——包括ppreviousIntent、pplayIntent、pnextIntent、pcloseIntent,还有MediaButtonReceiver.buildMediaButtonPendingIntent生成的PendingIntent,这些没处理的才是报错的真正原因。
修复方案:
- 先封装一个适配版本的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); }
- 把所有操作按钮的PendingIntent都用这个方法生成:
比如上一曲、播放/暂停等功能的Intent,替换成如下写法:
// 上一曲示例 Intent previousIntent = new Intent(this, 你的媒体广播接收器类.class); previousIntent.setAction("自定义的上一曲动作标识"); ppreviousIntent = createPendingIntent(previousIntent, 1, PendingIntent.FLAG_UPDATE_CURRENT); // 播放/暂停、下一曲、关闭的Intent按同样逻辑处理
- 替换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
相关产品推荐
相关产品推荐

