반응형
포스팅 환경
- 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 를 필수적으로 넣어줘야 한다는 내용입니다.
이상으로 포스팅을 마치겠습니다.
감사합니다 :)
반응형
'Develop > Error Box' 카테고리의 다른 글
[Android] app:processProductionReleaseGoogleServices' has completed is not supported (0) | 2024.04.12 |
---|---|
[Android] Compose IncompatibleComposeRuntimeVersionException Error (1) | 2022.07.28 |
[Android] - logcat: Unexpected EOF! Error (2) | 2021.03.02 |
[Android] W/ExifInterface: Invalid image: ExifInterface got an unsupported image format.... (0) | 2020.10.20 |
[Android] SDK licence accepted 문제 (0) | 2020.04.07 |