Android

Android12 APIレベル31、完全対応マニュアル

2023年1月から、Android12 APIレベル31、の対応が必須になりました。
そこで必要な対応内容と、それぞれの解説をまとめておきます。

解説はいらねぇ、対応だけパッパと見せやがれ!って人のために解説は注釈にしておきます。
順番は、僕自身が必要になったもの順です。

参考:
https://developer.android.com/google/play/requirements/target-sdk?hl=ja

 

0. build.gradleの、targetSdkVersion、を31にする

たまに、minSdkVersion だと勘違いしている方がいますが、targetSdkVersion、です。

 

1. AndroidManifestに、android:exported 属性の追加

AndroidManifest.xmlの

  • activity
  • receiver
  • service

タグに「android:exported=“false”」を追加する。
ただし、MainActivityだけは「android:exported=“true”」に。

資料にはserviceもって書いてるけど、書かなくても問題ないですね..。
IntentフィルターをService内で使ってないからかな?

他のアプリから呼び出せるかを定義する属性。
なので、MainActivityだけはtrueにするんです。
(デフォルトでそうしてよ)

 

2. PendingIntentに、PendingIntent.FLAG_IMMUTABLE フラグを追加

PendingIntentの第4引数、flagに、PendingIntent.FLAG_IMMUTABLE、を追加する。

PendingIntent.getBroadcast(
  context,
  requestCode,
  intent,
  PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
)

 

IMMUTABLEフラグを追加したのに、IMMUTABLEにしろってエラーが消えない場合は、gradleに次のimplementationを追加すること。

implementation "androidx.work:work-runtime-ktx:2.7.1"

 

他のアプリからPendingIntentの中身を書き換えられる脆弱性があるので、FLAG_IMMUTABLE(不変)を指定して、セキュアーにしたいのです。
(デフォルトでそうしてよ)

 

3. AndroidManifestniに、SCHEDULE_EXACT_ALARM 権限の追加

exact系の正確なアラームを使っている場合は、AndroidManifest、に、SCHEDULE_EXACT_ALARM 権限を追加していないと、「アラームを呼び出したタイミングで」 アプリが落ちます。最悪..。

iOSでは1.0ぐらいから有った、通知の許可を得るために必要になったそうです。
結局、アプリ内でユーザーに許可を得るためのダイアログを出すので、要らないと思うんですけどね。。

 

これ以降は、僕は設定していないけど、資料に有った内容を転記しておきます。

4. AndroidManifestの、Bluetooth権限宣言の置き換え

  • BLUETOOTH 権限
  • BLUETOOTH_ADMIN 権限

  • BLUETOOTH_SCAN 権限
  • BLUETOOTH_ADVERTISE 権限
  • BLUETOOTH_CONNECT 権限

のいずれかに置き換える。

参考:
https://developer.android.com/about/versions/12/features/bluetooth-permissions?hl=ja

 

5. AndroidManifestに、ACCESS_COARSE_LOCATION 権限の追加

ACCESS_FINE_LOCATION、をリクエストする場合、AndroidManifestに、ACCESS_COARSE_LOCATION 権限を追加する。

参考:
https://developer.android.com/training/location/permissions?hl=ja