1
1

More than 1 year has passed since last update.

Android12で起こったPendingIntentエラーについて(Chuckライブラリ)

Last updated at Posted at 2022-07-25

はじめに

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に追加します。

build.gradle()
// 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移行ガイド

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1