【Android12】flag_immutable or flag_mutable be specified when creating a pendingintentの対処法

Android12へのアプリ対応中のこと…

なんと次のようなエラーが発生

Targeting S+ (version 31 and above) requires that one of FLAG_IMMUTABLE or FLAG_MUTABLE be specified when creating a PendingIntent.

PnedingIntent...…?

アプリではそれを使ってませんでした。
それなのにエラーが出て少し困惑です。

その対処法が分かったのでメモしときます。

このエラーはAndroid12への対応中に起こった

Android12以降へのアプリ対応

▼ より正確に書くなら次の対応です

  • targetSdkVersionを31にする
  • compileSdkVersionを31にする
  • それに伴う不具合などの対応

▼ build.gradleをこのように修正した

ここからが問題です。

そうするとAndroid12以降ではホーム画面から起動されるランチャーActivityに android:exported="true"  を設定しないとエラーで落ちてしまうみたいです。

だから次のように修正が必要ということ

▼ AndroidManifest.xmlの修正例

もし targetSdkVersion を31以上にしたなら上記のような android:exported="true"  の追加が必要。
※ ただしtargetSdkVersionが30以下なら対応しなくても落ちない模様

その対処は問題ありませんでした。

PendingIntentを使ってないのにエラーで落ちてしまう

そして冒頭のエラーに遭遇しました。

▼ より具体的なエラー内容

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.

このPendingIntentというのはアプリ側で通知表示したりするとき、その通知をタップしたときの遷移先Activityを指定するのに使われるアレです。

でもそのアプリではPendingIntentは使ってません。

どうやら使用しなくても該当エラーが発生するようです。

対処法はwork-runtime-ktxライブラリを入れるだけ

その対処法はとても簡単でした。

▼ 次のライブラリを導入するだけです。

▼ build.gradleでのインストール例

追加したら Sync now を押せば完了です。

そしたらアプリビルドを実行

Android12エミュレータで正常に動きました。

アプリのtargetSdkVersionを31以上にするなら要警戒!

Android12以降への対応は次では不十分

  • targetSdkVersionを31にする
  • compileSdkVersionを31にする

実際にAndroid12の入ったエミュレータなりを用意し、
アプリインストしてエラーが出ないか確かめるのが確実です。

Androidのエラー・解決策関係とかの関連記事

Androidアプリ開発はエラーとの戦いとも言えます。

最後にそういったエラー・解決策の関連記事を紹介

▼  “emulator-5554 unauthorized” エラーの解決策

▼ ”Declare your Ad ID permission” への対処法

▼ ”Invalid Gradle JDK configuration found” の対処法

このブログではこういうAndroid関連のことも書いてます。

もし良ければご覧ください。ではまた