面向 S+(版本 31 及更高版本)要求在创建 PendingIntent、On AlarmPingSender 时指定 FLAG_IMMUTABLE 或 FLAG_MUTABLE 之一

问题描述 投票:0回答:9

问题

面向 S+(版本 31 及更高版本)要求在创建 PendingIntent 时指定 FLAG_IMMUTABLE 或 FLAG_MUTABLE 之一。我在将目标 SDK 更新到 31 后得到它。错误总是出现在 AlarmPingSender 之后。但我不知道有哪个类使用了 AlarmPingSender。


2021-10-31 10:43:04.990 17031-17341/com.app.mobile D/AlarmPingSender: Register alarmreceiver to MqttServiceMqttService.pingSender.com.app.mobile-2e24ccbde048f2e91635651784
2021-10-31 10:43:04.993 17031-17341/com.app.mobile E/AndroidRuntime: FATAL EXCEPTION: MQTT Rec: com.app.mobile-2e24ccbde048f2e91635651784
    Process: com.app.mobile, PID: 17031
    java.lang.IllegalArgumentException: com.app.mobile: Targeting S+ (version 31 and above) requires that one of FLAG_IMMUTABLE or FLAG_MUTABLE be specified when creating a PendingIntent.
    Strongly consider using FLAG_IMMUTABLE, only use FLAG_MUTABLE if some functionality depends on the PendingIntent being mutable, e.g. if it needs to be used with inline replies or bubbles.
        at android.app.PendingIntent.checkFlags(PendingIntent.java:375)
        at android.app.PendingIntent.getBroadcastAsUser(PendingIntent.java:645)
        at android.app.PendingIntent.getBroadcast(PendingIntent.java:632)
        at org.eclipse.paho.android.service.AlarmPingSender.start(AlarmPingSender.java:76)
        at org.eclipse.paho.client.mqttv3.internal.ClientState.connected(ClientState.java:1150)
        at org.eclipse.paho.client.mqttv3.internal.ClientState.notifyReceivedAck(ClientState.java:987)
        at org.eclipse.paho.client.mqttv3.internal.CommsReceiver.run(CommsReceiver.java:118)
        at java.lang.Thread.run(Thread.java:920)

我已经做了什么

  • 将 WorkManager 升级到 2.7.0
  • 设置 AllProject 强制使用 WorkManager 为 2.7.0
  • 更改所有现有的 PendingIntent 以使用 FLAG_IMMUTABLE
  • 有旧代码仍然使用 gcm 并禁用它
  • 更新所有 Firebase 软件包(有人说这是因为更高版本的分析)

使用的图书馆

  • 一个信号
  • 七叶树
  • Firebase
  • 工作经理
android kotlin android-pendingintent android-workmanager android-12
9个回答
44
投票

将以下内容添加到您的

build.gradle(app)
依赖项中。

dependencies {
  // For Java
  implementation 'androidx.work:work-runtime:2.7.1' 

  // For Kotlin
  implementation 'androidx.work:work-runtime-ktx:2.7.1'
}

22
投票

可能的解决方案

将 Google Analytics 升级为 Firebase Analytics。希望它能解决您的问题。同时升级您正在使用的所有库。

对我来说,以下解决方案可以解决问题。

PendingIntent.FLAG_IMMUTABLE
添加到您的待处理意图中。

这是一个例子 -

PendingIntent pendingIntent = PendingIntent.getActivity(this, alarmID, notificationIntent, PendingIntent.FLAG_IMMUTABLE);

欲了解更多信息,请点击此链接 - https://developer.android.com/reference/android/app/PendingIntent#FLAG_IMMUTABLE


9
投票

我发生了这次崩溃,但没有第 3 方库。使用最新版本添加此导入将修复崩溃。

implementation 'androidx.work:work-runtime-ktx:2.7.0-beta01'

4
投票

除了其他人的答案我还改变了:

implementation 'com.google.firebase:firebase-messaging:20.0.0'

至:

implementation 'com.google.firebase:firebase-messaging:23.0.0'

现在可以使用了。


2
投票

根据别人的回答可能是其中之一。或者删除这个库:

implementation 'androidx.hilt:hilt-work:1.0.0'

1
投票

在多次尝试解决此问题后,我放弃了并尝试联系 Qiscus。他们发布了处理此待定意图行为更改的新版本。因此,如果有人使用 Qiscus 并遇到此错误,您可以使用最新标签

https://github.com/qiscus/qiscus-sdk-android/releases/tag/1.3.35


1
投票

如果您的项目中使用了WorkManager,请将其更新到最新。如果不这样做,请将所有 Firebase 库和 google 库更新到最新版本。我遇到了同样的问题,我正在一一更新库。我发现更新

com.google.android.gms:play-services-ads
到最新解决了问题


1
投票

需要避免在 Android 12 API 31 上发生崩溃

 implementation 'androidx.work:work-runtime-ktx:2.7.1'

0
投票

我正在尝试使用 PendingIntent.FLAG_NO_CREATE 来检查是否已设置现有警报。但现在这引发了我需要强制仅使用可变或不可变标志的错误,并给了我例外。如果我们不能使用Flag_No_Create

,那么现在如何检查是否存在现有警报?
© www.soinside.com 2019 - 2024. All rights reserved.