[Error] Android s+ (version 31 and above) ... flag_immutable or flag_mutable 에러

HongDuHyeon·2024년 7월 12일
0
post-thumbnail
오우오우 오랜만에 지멋대로 블로거 등장

회사에서 react-native로 앱에서 위젯 추가하기를 진행하던 중 제법 긴(?) 에러를 만났다.
에러의 내용은 다음과 같다

Android targeting s+ (version 31 and above) requires that one of flag_immutable or flag_mutable be specified when creating a pendingintent.

이 게시글에서 한번 다뤘던 내용이지만 한번 더 게시글에 남기는 게 좋을 것 같아 포스팅한다.

먼저 발생한 케이스는 appWidgetManager를 사용하려고 할 때 발생했다.

appWidgetManager란? (requestPinAppWidget)

앱 내에서 클릭으로 바탕화면에 위젯을 만들 수 있게 도와주는 메서드라고 생각하면 된다.
RN의 nativeModules를 활용해 앱 내의 특정 버튼 클릭시 내가 설정한 위젯을 바로 만들 수 있게 만들 수 있다.

에러 해석

PendingIntent를 생성할 때 31버전 이상을 타겟하려면 4번째 인자의 Flag 자리에 flag_immutable이나 flag_mutable을 사용해야한다고 구글에서 강력히 권고한다고 한다.

  val context: Context = reactApplicationContext
  val appWidgetManager = AppWidgetManager.getInstance(context)

  val provider = ComponentName(context, Widget::class.java)

  // SDK > 26 (android 8.0)
  if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && appWidgetManager.isRequestPinAppWidgetSupported){
  	val intent = Intent(context, AndroidAppWidget::class.java)
  	val successCallback = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_IMMUTABLE)

  	appWidgetManager.requestPinAppWidget(provider, null, successCallback)
  }
  • 추가 getBroadcast document

+ Flag란 ?

FLAG_CANCEL_CURRENT: 사용할 Intent에 대해 한 번에 하나만 활성화해야 하는 경우 사용하며, 이전에 생성한 PendingIntent를 취소한 후 새로 생성한다.
FLAG_IMMUTABLE: 생성된 PendingIntent가 불변(변경될 수 없음)이라는 것을 나타낸다.
FLAG_MUTABLE: 생성된 PendingIntent가 변경 가능해야한다는 것을 나타낸다.
FLAG_NO_CREATE: PendingIntent가 아직 존재하지 않는 경우 생성하는 대신 단순 null을 반환함을 나타낸다.
FLAG_ONE_SHOT: 해당 PendingIntent를 한 번만 사용할 수 있음을 나타낸다.
FLAG_UPDATE_CURRENT: 기존에 생성된 PendingIntent가 있다면 새로운 값으로 업데이트한다.

계속 React-native만 해왔다고 하지만 kotlin은 아직도 여전히 어려운 것 같다.
할 때마다 머릿속에서 초기화되는 느낌
정진.. 또 정진....

profile
마음이 시키는 프론트엔드.. RN과 IOS를 곁들인..

0개의 댓글