관리 메뉴

나만을 위한 블로그

[Android] Targeting S+ (version 31 and above) requires that one of FLAG_IMMUTABLE or FLAG_MUTABLE be specified when creating a PendingIntent 에러 해결 본문

Android

[Android] Targeting S+ (version 31 and above) requires that one of FLAG_IMMUTABLE or FLAG_MUTABLE be specified when creating a PendingIntent 에러 해결

참깨빵위에참깨빵_ 2022. 4. 29. 18:25
728x90
반응형

내용 작성에 앞서 내가 사용하는 안드로이드 스튜디오 버전은 아래와 같으니 참고하자.

 

 

제목의 에러가 너무 길어서 첫 번째 온점을 기준으로 잘랐다. 에러 원문은 아래와 같다.

 

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.

 

뭔 소린지 모르겠으니 한글로 바꿔보자.

 

S+(버전 31 이상)를 타겟팅하려면 PendingIntent를 생성할 때 FLAG_IMMUTABLE 또는 FLAG_MUTABLE 중 하나를 지정해야 합니다. FLAG_IMMUTABLE 사용을 강력히 고려하고 일부 기능이 변경 가능한 PendingIntent에 의존하는 경우에만 FLAG_MUTABLE을 사용하십시오. 인라인 회신이나 말풍선과 함께 사용해야 하는 경우.

 

이 에러는 코틀린 안드로이드 프로젝트에 FCM을 붙이면서 발생했다. 범블비 이전에 사용하던 버전에선 나오지 않았는데, 범블비로 바꾸면서 타겟 SDK가 32가 되니 이런 에러가 발생한다.

해결 방법은 앱 수준 gradle에 아래 의존성을 추가하는 것이다.

 

// 자바를 쓰는 경우
implementation 'androidx.work:work-runtime:2.7.1' 

// 코틀린을 쓰는 경우
implementation 'androidx.work:work-runtime-ktx:2.7.1'

 

만약 이걸 추가해도 해결되지 않는다면 MyFirebaseMessagingService 파일에 아래 코드를 추가해보자.

자바 형태로 작성돼 있으니 코틀린 형태로 바꿔야 한다. 코틀린 프로젝트에 그대로 복붙하면 알아서 코틀린으로 변환된다.

 

PendingIntent pendingIntent = PendingIntent.getActivity(this, alarmID, notificationIntent, PendingIntent.FLAG_IMMUTABLE);

 

내 경우는 getActivity()의 마지막 인자를 아래 것으로 사용하는데 이걸 써도 별다른 에러는 발생하지 않았다.

 

val pendingIntent = PendingIntent.getActivity(this, 0, /* Request code */ intent, PendingIntent.FLAG_ONE_SHOT)
반응형
Comments