Develop/Error Box

[Android] - PendingIntent FLAG_IMMUTABLE, FLAG_MUTABLE 에러

Linitial 2022. 10. 13. 17:22
반응형

포스팅 환경

  • M1 Mac OS Monterey 12.5.1
  • Android Studio Chipmunk 2021.2.1 Patch1 (ARM)
  • Gradle 7.2
  • Android Build Gradle 7.1.2
  • Kolin 1.7.0

원인

TargetSdk 32 기준으로 FCM 붙이다가 아래와 같은 에러를 만났습니다.

E/AndroidRuntime: FATAL EXCEPTION: Firebase-Messaging-Intent-Handle
    Process: kr.co.softopia.push_example, PID: 19579
    java.lang.IllegalArgumentException: kr.co.softopia.push_example: 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 kr.co.softopia.push_example.FcmMessagingService.sendNotification(FcmMessagingService.kt:95)
        at kr.co.softopia.push_example.FcmMessagingService.onMessageReceived(FcmMessagingService.kt:76)
        at com.google.firebase.messaging.FirebaseMessagingService.dispatchMessage(FirebaseMessagingService.java:235)
        at com.google.firebase.messaging.FirebaseMessagingService.passMessageIntentToSdk(FirebaseMessagingService.java:185)
        at com.google.firebase.messaging.FirebaseMessagingService.handleMessageIntent(FirebaseMessagingService.java:172)
        at com.google.firebase.messaging.FirebaseMessagingService.handleIntent(FirebaseMessagingService.java:161)
        at com.google.firebase.messaging.EnhancedIntentService.lambda$processIntent$0$com-google-firebase-messaging-EnhancedIntentService(EnhancedIntentService.java:78)
        at com.google.firebase.messaging.EnhancedIntentService$$ExternalSyntheticLambda1.run(Unknown Source:6)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1137)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:637)
        at com.google.android.gms.common.util.concurrent.zza.run(com.google.android.gms:play-services-basement@@18.1.0:2)
        at java.lang.Thread.run(Thread.java:1012)

 

문제가 된 코드 부분은 Notification 을 만드는 부분에서 발생했습니다

val pendingIntent = PendingIntent.getActivity(this@FcmMessagingService, 0, intent, PendingIntent.FLAG_ONE_SHOT)

 

해결

PendingIntent 를 만드는 코드에서 FLAG 값으로 FLAG_IMMUTABLE 혹은 FLAG_MUTABLE 을 사용하여야 한다는 것 인데 FLAG_IMMUTABLE 로 수정해주니 더 이상 해당 에러가 발생하지 않았습니다.

val pendingIntent = PendingIntent.getActivity(this@FcmMessagingService, 0, intent, PendingIntent.FLAG_IMMUTABLE)

 

FLAG_IMMUTABLE? FLAG_MUTABLE?

도대체 해당 FLAG 값을 어떤 것을 의미하는지 궁금해서

코드를 까보니 주석이 아래 처럼 달려있었는데요

 

이를 번역해보면. 아래와 같이 되는데

FLAG_IMMUTABLE
생성된 PendingIntent가 변경할 수 없음을 나타내는 플래그입니다. 
이는 이 인텐트의 채워지지 않은 속성을 채우기 위해 send 메소드에 전달된 
추가 인텐트 인수가 무시된다는 것을 의미합니다.
FLAG_IMMUTABLE은 send 호출자가 send에 의해 보낸 의도의 의미를 
변경하는 기능만 제한합니다. PendingIntent의 작성자는 항상 FLAG_UPDATE_CURRENT
를 통해 PendingIntent 자체를 업데이트할 수 있습니다.

FLAG_MUTABLE
생성된 PendingIntent가 변경 가능해야 함을 나타내는 플래그입니다.
이 플래그는 FLAG_IMMUTABLE과 결합할 수 없습니다.
Build.VERSION_CODES.R까지 FLAG_IMMUTABLE이 설정되지 않는 한 
PendingIntents는 기본적으로 변경 가능한 것으로 간주됩니다. 
Build.VERSION_CODES.S부터 (@link #FLAG_IMMUTABLE} 또는 FLAG_MUTABLE 
을 사용하여 생성 시 PendingIntents의 변경 가능성을 명시적으로 지정해야 합니다.
PendingIntent를 생성할 때 FLAG_IMMUTABLE을 사용하는 것이 좋습니다. 
FLAG_MUTABLE은 다음 경우에만 사용해야 합니다. 
일부 기능은 기본 의도 수정에 의존합니다(예: 인라인 응답 또는 거품과 함께 사용해야 
하는 PendingIntent).

 

결국 핵심 요약은 TargetSdk32 부터 PendingIntent 가 변경이 가능한지, 불가능한지

FLAG 를 필수적으로 넣어줘야 한다는 내용입니다.

 

 

이상으로 포스팅을 마치겠습니다.

감사합니다 :)

반응형