Сбой приложения из-за PendingIntent при таргетинге на Android 12

#android #google-play-services #google-nearby

Вопрос:

Приложение вышло из строя из-за близлежащего API сообщений при таргетинге на Android 12. Вот журнал сбоев

 2021-10-07 18:59:44.916 10343-10384/com.example.nearbymessagescanner E/AndroidRuntime: FATAL EXCEPTION: GoogleApiHandler
Process: com.example.nearbymessagescanner, PID: 10343
java.lang.IllegalArgumentException: com.example.nearbymessagescanner: 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.getActivityAsUser(PendingIntent.java:458)
    at android.app.PendingIntent.getActivity(PendingIntent.java:444)
    at android.app.PendingIntent.getActivity(PendingIntent.java:408)
    at com.google.android.gms.common.api.GoogleApiActivity.zaa(com.google.android.gms:play-services-base@@17.5.0:4)
    at com.google.android.gms.common.GoogleApiAvailability.zaa(com.google.android.gms:play-services-base@@17.5.0:116)
    at com.google.android.gms.common.api.internal.GoogleApiManager.zaa(com.google.android.gms:play-services-base@@17.5.0:252)
    at com.google.android.gms.common.api.internal.GoogleApiManager$zaa.zaa(com.google.android.gms:play-services-base@@17.5.0:109)
    at com.google.android.gms.common.api.internal.GoogleApiManager$zaa.onConnectionFailed(com.google.android.gms:play-services-base@@17.5.0:75)
    at com.google.android.gms.common.internal.zai.onConnectionFailed(com.google.android.gms:play-services-base@@17.5.0:2)
    at com.google.android.gms.common.internal.BaseGmsClient$zzf.zza(com.google.android.gms:play-services-basement@@17.5.0:6)
    at com.google.android.gms.common.internal.BaseGmsClient$zza.zza(com.google.android.gms:play-services-basement@@17.5.0:21)
    at com.google.android.gms.common.internal.BaseGmsClient$zzc.zzc(com.google.android.gms:play-services-basement@@17.5.0:11)
    at com.google.android.gms.common.internal.BaseGmsClient$zzb.handleMessage(com.google.android.gms:play-services-basement@@17.5.0:49)
    at android.os.Handler.dispatchMessage(Handler.java:106)
    at android.os.Looper.loopOnce(Looper.java:201)
    at android.os.Looper.loop(Looper.java:288)
    at android.os.HandlerThread.run(HandlerThread.java:67)
 

Это исключение случается, даже если я добавил флаг PendingIntent.FLAG_MUTABLE или PendingIntent.FLAG_IMMUTABLE для PendingIntent

     private fun backgroundSubscribe() {
    Log.d(TAG, "Subscribing for background updates.")
    val options = SubscribeOptions.Builder().setStrategy(Strategy.BLE_ONLY).build()
    messagesClient.subscribe(pendingIntent, options)
}

    private val pendingIntent: PendingIntent
    get() = PendingIntent.getBroadcast(
        this,
        0,
        Intent(this, BeaconMessageReceiver::class.java),
        PendingIntent.FLAG_MUTABLE
    )
 

Это пример приложения, которое может воспроизвести эту проблему, нажав кнопку «подписаться» в приложении.
Я использую версию 18.0.0 play-сервисов поблизости

 implementation 'com.google.android.gms:play-services-nearby:18.0.0'
 

Комментарии:

1. Я сталкиваюсь с той же проблемой, несмотря на самую последнюю версию 17.6.0 в подвале в стеке. Я почти уверен, что код подвала, датированный 21 февраля, еще не готов для Android. Это внутренний PendingIntent, что-то связанное с ветвью onConnectionFailed.

Ответ №1:

  1. Это звучит странно, но исправление добавляет зависимость от менеджера работы 2.7.0 : implementation "androidx.work:work-runtime:2.7.0"
  2. Вам необходимо обновить зависимости, которые должны поддерживать изменения в тормозах Android 12 (мне пришлось обновить некоторые сторонние приложения). Проверьте это на страницах github и документации
  3. Кроме того, некоторые библиотеки используют разрешение <uses-permission android:name="com.google.android.gms.permission.AD_ID"/> , необходимое для Android 12. Пожалуйста, ознакомьтесь с документацией для получения этого разрешения
  4. Кроме того, проверьте систему отслеживания проблем Google на наличие проблем, связанных с библиотекой Google, связанных с Android 12

Может быть, я что-то упустил, но все это помогло мне мигрировать. Удачи 🙂

Комментарии:

1. Привет @Слава Сотоне, спасибо за ваш комментарий. Я попробовал твое предложение. К сожалению, это не работает.

2. К сожалению, это тоже не работает 🙁

3. @apc Я обновил свой ответ. Вы могли бы проверить это, если это все еще проблема для вас

4. @TaxistSamael Спасибо за обновление, но в моем случае трассировка стека немного отличается, похоже, что внутри самой библиотеки сервисов Google Play существуют некоторые другие внутренние проблемы с зависанием. На данный момент это подтвержденная проблема: issuetracker.google.com/issues/206343771 , также я прекрасно понимаю, почему исправление во время выполнения работы работает для одного случая и не работает для другого. Вероятно, нам придется подождать исправлений… (в моем случае, для библиотеки в подвале)

5. @apc Тоже спасибо за вашу долю. Я согласен с вами. Я думаю, нам нужно подождать исправлений

Ответ №2:

Я смог решить эту проблему для проекта Xamarin, добавив Xamarin.AndroidX.work.runtime пакет NuGet.