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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 07:01:16