#android #kotlin #android-pendingintent #android-workmanager #android-12
Вопрос:
Проблема
Для таргетинга 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 (некоторые говорили, что это из-за более поздней версии analytics)
Используемая библиотека
- OneSignal
- Qiscus
- Firebase
- WorkManager
Комментарии:
1. В сообщении об ошибке говорится, что ваша ошибка вызвана
org.eclipse.paho.android.service.AlarmPingSender.start(AlarmPingSender.java:76)
, которая выглядит связанной с любой используемой вами библиотекой MQTT.2. да, я тоже так думаю, но я не могу понять, какая библиотека использовала MQTT, я предполагаю, что Qiscus, но я попытался обновить до последней версии, но проблема сохраняется.
3. Вы можете проверить сканирование сборки Gradle , чтобы узнать, какая зависимость извлекается из библиотеки Eclipse Paho
4. Я считаю, что этот код github.com/eclipse/paho.mqtt.android/blob/master / … (строка 76) необходимо обновить, чтобы соответствовать новым ограничениям Android. github.com/eclipse/paho.mqtt.android/issues/465
Ответ №1:
Возможное решение
Обновите Google analytics до firebase analaytics. Надеюсь, это решит ваши проблемы.Также обновите всю библиотеку, которую вы используете.
Для меня приведенные ниже решения решают проблему.
Добавить PendingIntent.FLAG_IMMUTABLE
в ваши ожидающие намерения.
Вот пример —
PendingIntent pendingIntent = PendingIntent.getActivity(this, alarmID, notificationIntent, PendingIntent.FLAG_IMMUTABLE);
Для получения дополнительной информации перейдите по этой ссылке — https://developer.android.com/reference/android/app/PendingIntent#FLAG_IMMUTABLE
Комментарии:
1. Я уже пробовал это, но проблема сохраняется.
2. Обновление библиотеки Firebase решило проблему для меня.
3. Как обновить Google analytics до firebase analytics?
Ответ №2:
Добавьте следующее к своим 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'
}
Ответ №3:
У меня был этот сбой, но не было сторонних библиотек. Добавление этого импорта с последней версией исправит сбой.
implementation 'androidx.work:work-runtime-ktx:2.7.0-beta01'
Комментарии:
1. Работает для меня. В моем случае изменено на: реализация («androidx.work:work-runtime-ktx: 2.7.1»)
Ответ №4:
в дополнение к ответам других я изменил :
implementation 'com.google.firebase:firebase-messaging:20.0.0'
Для :
implementation 'com.google.firebase:firebase-messaging:23.0.0'
и он работает сейчас.
Ответ №5:
После нескольких попыток исправить это я сдался и попытался связаться с Qiscus. И они выпускают новую версию, которая обрабатывает это ожидающее изменения поведения намерения. Поэтому, если кто-нибудь использует Qiscus и получил эту ошибку, вы можете использовать тег latest
https://github.com/qiscus/qiscus-sdk-android/releases/tag/1.3.35
Ответ №6:
Просто напишите этот код, в котором вы используете ожидающее намерение
PendingIntent pendingIntent = null;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.S) {
pendingIntent = PendingIntent.getActivity
(this, 0, notificationIntent, PendingIntent.FLAG_MUTABLE);
}
else
{
pendingIntent = PendingIntent.getActivity
(this, 0, notificationIntent, PendingIntent.FLAG_ONE_SHOT);
}
Также вставьте приведенный ниже код в gradle.build
implementation 'androidx.work:work-runtime:2.7.1'
Ответ №7:
Это может быть проблемой с версией библиотеки. Если в вашем проекте есть библиотеки более старых версий, вам необходимо обновить его до последней версии.
Итак, обновите рабочую среду выполнения и версию библиотеки обмена сообщениями firebase следующим образом,
dependencies {
// For Java
implementation 'androidx.work:work-runtime:2.7.1'
// For Kotlin
implementation 'androidx.work:work-runtime-ktx:2.7.1'
implementation 'com.google.firebase:firebase-messaging:23.0.0'
...
}
Кроме того, убедитесь, что ожидающий код намерения выглядит примерно так,
PendingIntent pendingIntent = PendingIntent.getActivity(this, alarmID, notificationIntent, PendingIntent.FLAG_IMMUTABLE);