はじめに
Android12からPendingIntentにフラグの設定が必要になったのですが、使用していたChuckライブラリにもその影響がありエラーになってしまいました。
今回はそのエラーの対応方法についてご紹介します。
開発環境
PC:MacBook Pro
OS:macOS BigSur
Android Studio:Arctic Fox 2021.1.1
PendingIntentのエラー対応方法
SDKバージョンを31にしてアプリを実行した際に、PendingIntentを使用している箇所で以下のようなエラーが出る場合があります。
PendingIntentを作成するときにFLAG_IMMUTABLEまたはFLAG_MUTABLEのいずれかを指定する必要があります。
FLAG_IMMUTABLEの使用を強く検討してください。
たとえば、インライン応答やバブルで使用する必要がある場合など、
一部の機能がPendingIntentの変更可能性に依存している場合にのみ、FLAG_MUTABLEを使用してください。
これはAndroid12ではPendingIntentに可変性を指定する必要があるためです。(Android developers)
基本的にFLAG_IMMUTABLEかFLAG_MUTABLEを設定してあげれば大丈夫だそうです。
2つの違いは以下の通りです。
・FLAG_IMMUTABLE:
パラメータを追加をしたとしても元々のIntentは変更はされず、起動された側でも取得できずにnullになる。
(ほとんどの場合はFLAG_IMMUTABLEで良いとされています)
・FLAG_MUTABLE:
変更が可能となり、先程のパラメータを追加したときに、起動された側で取得することが出来る。
実装
//FLAG_IMMUTABLEのフラグを設定
val pendingIntent = PendingIntent.getActivity(it, 0, intent, PendingIntent.FLAG_IMMUTABLE)
//FLAG_MUTABLEのフラグを設定
val pendingIntent = PendingIntent.getActivity(it, 0, intent, PendingIntent.FLAG_MUTABLE)
上記対応ででエラーがなくなった方はここまででOKです!
Chuckライブラリのエラー対応方法
上記対応を行ってもまだ同じエラーが表示され、さらにChuckライブラリを使っている!という方はこちらを参考にしてみてください。
調査したところChuckライブラリはインテントフラグに対応していないことが分かりました。(Android12/S #634での例外)
ということでChuckライブラリはAndroid12に対応していないことが分かったので、Chuckerライブラリに移行しました。
移行は難しくなく、基本的にこちらの移行ガイドを見れば大丈夫です!
実装
まずChuckライブラリは不要なので削除し、代わりにChuckerライブラリをgradleファイルのdependencies
に追加します。
// Chuckerライブラリ
debugImplementation "com.github.ChuckerTeam.Chucker:library:3.0.1"
releaseImplementation "com.github.ChuckerTeam.Chucker:library-no-op:3.0.1"
次にChuckInterceptor
を使用している箇所をChuckerInterceptor
に変更します。
その後設定を行います。こちらについてはChuckerライブラリのページ内のConfigure
という見出しを見ると詳細が分かります。
// Create the Interceptor
val chuckerInterceptor = ChuckerInterceptor.Builder(context)
.collector(chuckerCollector)
.maxContentLength(250_000L)
.redactHeaders("Auth-Token", "Bearer")
.alwaysReadResponseBody(true)
.addBodyDecoder(decoder)
.createShortcut(true)
.build()
// OkHttpClient内にChuckerInterceptorを接続
val client = OkHttpClient.Builder()
.addInterceptor(chuckerInterceptor)
.build()
これでChuckライブラリによるPendingIntentのエラーは解決できたはずです!
PendingIntentのエラーが出た時は「フラグ追加すればいいだけじゃん」と思いましたが、ライブラリにも影響あることが分かったので今後は注意して行きます。。
参考文献
・Android developers
・Chuckライブラリ
・Android12/S #634での例外
・Chuckerライブラリ
・Chucker移行ガイド