ANDROID

: java.lang.IllegalArgumentException: 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 ..

닥치고개발 2023. 3. 14. 10:27
728x90

안드로이드 targetSdkVersion 31를 변경하였다.

일단 변경을 하지 않으면 스토어에 올라가지 않는다.

변경 후 아래와 같이 크레쉬가 발생하기 시작했다.

Fatal Exception: java.lang.IllegalArgumentException: com.abc.client.traveler: 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:382)
       at android.app.PendingIntent.getActivitiesAsUser(PendingIntent.java:616)
       at android.app.PendingIntent.getActivities(PendingIntent.java:598)
       at android.app.TaskStackBuilder.getPendingIntent(TaskStackBuilder.java:275)
       at android.app.TaskStackBuilder.getPendingIntent(TaskStackBuilder.java:249)
       at com.abc.client.traveler.fcm.CmFirebaseMessagingService.makePendingIntent(CmFirebaseMessagingService.kt:218)
       at com.abc.client.traveler.fcm.CmFirebaseMessagingService.sendNotification(CmFirebaseMessagingService.kt:179)
       at com.abc.client.traveler.fcm.CmFirebaseMessagingService.processDataMessage(CmFirebaseMessagingService.kt:128)
       at com.abc.client.traveler.fcm.CmFirebaseMessagingService.onMessageReceived(CmFirebaseMessagingService.kt:82)
       at com.google.firebase.messaging.FirebaseMessagingService.dispatchMessage(com.google.firebase:firebase-messaging@@20.3.0:74)
       at com.google.firebase.messaging.FirebaseMessagingService.passMessageIntentToSdk(com.google.firebase:firebase-messaging@@20.3.0:44)
       at com.google.firebase.messaging.FirebaseMessagingService.handleMessageIntent(com.google.firebase:firebase-messaging@@20.3.0:27)
       at com.google.firebase.messaging.FirebaseMessagingService.handleIntent(com.google.firebase:firebase-messaging@@20.3.0:17)
       at com.google.firebase.messaging.EnhancedIntentService.lambda$processIntent$0$EnhancedIntentService(com.google.firebase:firebase-messaging@@20.3.0:43)
       at com.google.firebase.messaging.EnhancedIntentService$$Lambda$0.run(:6)
       at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
       at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
       at com.google.android.gms.common.util.concurrent.zza.run(com.google.android.gms:play-services-basement@@17.2.1:6)
       at java.lang.Thread.run(Thread.java:920)

무슨일인가?

  • 일단 아래 런타임 라이브러리를 추가한다.

    implementation 'androidx.work:work-runtime-ktx:2.7.1'
  • 그리고 기존 pendingIntent사용하는 곳을 수정한다, 나는 FLAG_UPDATE_CURRENT 으로 되어있어서 해당값은

  • PendingIntent.FLAG_UPDATE_CURRENT -> PendingIntent.FLAG_IMMUTABLE 으로 변경한다.

변경 전

private fun makePendingIntent(intent: Intent): PendingIntent {

        val stackBuilder = TaskStackBuilder.create(this)
        stackBuilder.addNextIntentWithParentStack(intent)

        return stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT)
    }

변경 후

private fun makePendingIntent(intent: Intent): PendingIntent {

        val stackBuilder = TaskStackBuilder.create(this)
        stackBuilder.addNextIntentWithParentStack(intent)

        return stackBuilder.getPendingIntent(0, PendingIntent.FLAG_IMMUTABLE)
    }

정상동작하는지 FCM테스트를 진행한다.
잘된다면, 잘 해결된 것이다.

728x90