Android S+版本创建PendingIntent报错:需指定FLAG_IMMUTABLE/MUTABLE
解决方案:Android S+ 下 OneSignal 导致的 PendingIntent 崩溃问题
问题根源
从错误栈可以明确:崩溃是OneSignal 内部创建 Broadcast 类型 PendingIntent 时,未添加 Android 12+ 强制要求的 FLAG_IMMUTABLE 或 FLAG_MUTABLE 标记。你自己编写的 getActivity 类型 PendingIntent 代码,完全没覆盖到第三方库内部的调用逻辑,因此无法解决问题。
有效解决步骤
1. 升级 OneSignal SDK 到兼容 Android 12+ 的版本
这是最直接、彻底的解决方式。OneSignal 在 4.5.0 及以上版本已经修复了 Android 12 的 PendingIntent 标记问题。
- 打开项目的
app/build.gradle文件,找到 OneSignal 的依赖配置,替换为最新稳定版:
implementation 'com.onesignal:OneSignal:[4.5.0, 5.0.0)'
- 点击 Android Studio 的「Sync Project with Gradle Files」同步依赖
- 重新构建并运行应用
2. 无法立即升级 SDK 的临时方案(不推荐)
如果因特殊情况不能升级 SDK,可通过自定义通知逻辑绕过问题,但操作复杂且易引入新问题,优先推荐升级 SDK:
- 关闭 OneSignal 的自动通知展示,接管通知构建流程:
OneSignal.setNotificationWillShowInForegroundHandler { notificationReceivedEvent -> // 禁用默认通知展示 notificationReceivedEvent.complete(null) // 自定义通知构建,确保所有 PendingIntent 携带合规标记 val intent = Intent(applicationContext, YourTargetActivity::class.java) val pendingIntent = PendingIntent.getActivity( applicationContext, NOTIFICATION_REQUEST_CODE, intent, PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT ) val notification = NotificationCompat.Builder(applicationContext, YOUR_CHANNEL_ID) .setContentTitle(notificationReceivedEvent.notification.title) .setContentText(notificationReceivedEvent.notification.body) .setSmallIcon(R.drawable.ic_notification) .setContentIntent(pendingIntent) .build() NotificationManagerCompat.from(applicationContext).notify(NOTIFICATION_REQUEST_CODE, notification) }
验证
完成上述操作后,重新触发消息推送,检查应用是否再出现重启崩溃的情况。
内容的提问来源于stack exchange,提问作者Sadece Ata
相关产品推荐
相关产品推荐

