Android 12下PendingIntent报错:需指定FLAG_IMMUTABLE/MUTABLE
解决Android 12+ PendingIntent必须指定标志位的问题
核心修复步骤
根据报错栈信息,问题出在com.general.files.NotificationScheduler类的cancelReminder和setReminder方法中——调用PendingIntent.getBroadcast时未指定强制标志位,按以下方式修改即可:
选择合适的标志位
- 若不需要后续修改PendingIntent内的Intent内容,优先使用
FLAG_IMMUTABLE(官方推荐,安全性更高) - 若功能依赖修改PendingIntent(比如内联回复、气泡消息场景),则使用
FLAG_MUTABLE
- 若不需要后续修改PendingIntent内的Intent内容,优先使用
添加版本兼容的标志位逻辑
修改PendingIntent.getBroadcast的调用代码,加入对应标志:int pendingIntentFlags; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { // Android 12及以上必须指定标志 pendingIntentFlags = PendingIntent.FLAG_IMMUTABLE; // 需可变场景替换为:PendingIntent.FLAG_MUTABLE } else { // 低版本保留原有标志(示例用0,若之前有自定义标志可替换) pendingIntentFlags = 0; } PendingIntent.getBroadcast(context, requestCode, yourIntent, pendingIntentFlags);如果你使用AndroidX库,也可以用
PendingIntentCompat简化兼容,无需手动判断版本:import androidx.core.app.PendingIntentCompat; PendingIntentCompat.getBroadcast(context, requestCode, yourIntent, PendingIntentCompat.FLAG_IMMUTABLE);
报错原因说明
Android 12(API 31)起强制要求创建PendingIntent时指定可变性标志,目的是提升应用安全性,防止第三方应用篡改PendingIntent内的Intent数据。当应用的targetSdkVersion >=31时,未指定FLAG_IMMUTABLE或FLAG_MUTABLE就会触发IllegalArgumentException。
内容的提问来源于stack exchange,提问作者ibrahim
相关产品推荐
相关产品推荐

