Для таргетинга S (версия 31 и выше) требуется, чтобы при создании PendingIntent в AlarmPingSender был указан один из FLAG_IMMUTABLE или FLAG_MUTABLE

#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);