Android 12 開発におけるバージョン差異への対応方法:重要なコツを公開!

この記事では、私の開発経験を共有し、
Android バージョンアップによる課題とその解決策について探ります。
私が直面した問題を分析することで、
開発プロセスで同様の問題に直面した際に役立つ洞察を提供できればと思います。

公式の変更点を確認したい場合は、
直接 Android Developer をご覧ください

Android 12 に影響を受ける機能
Android 12以上 新しいOSカメラとマイクの権限スイッチ
  • ユーザーはスタートバー内のクイックボタンや設定内のカメラまたはマイクのアクセス権のスイッチを使用してオン/オフを切り替えることができます
  • カメラの使用体験に影響を与える可能性があります。
    カメラの権限をオンにしても、
    ユーザーがカメラのアクセス権をオフにすると、
    カメラは黒い画面を表示します。
    マイクも同様です:参考

  • 現在、システムがサポートしているかどうかを検出するためのコードがあり、ユーザーに通知することができますが、オンになっているかどうかを判断するAPIはまだ見つかっていません。
Android 12以上 ACTION_CLOSE_SYSTEM_DIALOGS が廃止されました: 参考
  • しかし、Android 13ではアクセシビリティ権限をオンにすると、ACTION_CLOSE_SYSTEM_DIALOGS を送信できますが、オフにするとこのブロードキャストは受信されません。
Android 12以上 スプラッシュ画面にデフォルトの起動画面が追加されました このページのチュートリアルで新しいスプラッシュ画面に移行できます
  • 以下のようにデフォルトのアイコンの起動画面が追加されました
    android12_splash_icon.gif
  • 実際にテストしたところ、このデフォルトのスプラッシュ画面を削除する方法は提供されていません。
    以前のカスタムActivityを削除しても画面は表示されませんが、以前のサイクルは実行されます。
    公式も新しいスプラッシュ画面に関するいくつかの仕様を提供しています:参考

  • 調整方法:
    • implementation 'androidx.core:core-splashscreen:1.0.0'をbuild.gradleに追加します
      ここで注意すべきは、min sdkの要件が21以上であることです
      android12_splash_min_sdk.png
    • 新しいスプラッシュ画面のテーマを設定します windowSplashScreenBackgroundは背景色で、実際に設定できるのは@colorのみです
      windowSplashScreenAnimatedIconは中央の円形ビューのアイコンで、画像を設定できますが、サイズは公式が発表したものに従う必要があります
      windowSplashScreenBrandingImageはアイコンの下にある小さな背景画像です
      windowSplashScreenAnimationDurationはアニメーションの時間です
      その他の属性

    • 新しいSplashThemeをAndrodManifest.xmlに追加

    • 初期コードを追加

    SplashScreen.installSplashScreen(this)super.onCreateの前に必要

    splashScreen.setKeepOnScreenCondition(() -> true );
    この行は、元の古いアクティビティ画面を表示しないが、アクティビティのライフサイクルは実行されるようにします
    ただし、この方法は新しい公式のスプラッシュを使用するため、元のカスタマイズされた画面は表示されません。ここは各プロダクトオーナーが自行考量してください

Android target sdk 12以上では、intent-filterにandroid:exportedの値が宣言されていないとインストールできない可能性があります
  • 図のように、コンパイル後にインストールしようとすると、次のようなINSTALL_PARSE_FAILED_MANIFEST_MALFORMEDエラーが表示されます android12_exported_crash.png
  • また、PendingIntentを使用する場合も対応するフラグを追加しないとエラーが発生します:
  • 解決方法&デモ:
    • 各PendingIntent作成箇所にFLAG_IMMUTABLEまたはFLAG_MUTABLEタグを追加する必要があります
    • 最新のwork-runtimeを追加:implementation 'androidx.work:work-runtime:2.7.1'
      android12_workmanager.png
    • 備考
      • ここではAirdroidを例にしていますが、現在Airdroid & httphelperリポジトリは分かれているため、他の箇所も修正が必要です
      • 隠れたPendingIntentも修正が必要で、implementされたライブラリ内でもPendingIntentが使用されています 現在のAirdroidプロジェクト内で使用されているGoogle Analytics 17.0.0バージョンでもエラーメッセージが表示されます (このような場合、実際にそのコードを実行してみないとPendingIntentのエラーがあるかどうかわかりません) android_12_error_01.png この場合、バージョンを上げるだけで解決します implementation 'com.google.android.gms:play-services-analytics:18.0.1'
Target sdkを32に上げると、setAppCacheEnabled(flag Boolean)とsetAppCachePath(path String)が削除されました

Chromiumがこの機能を削除したため、sdkはもはやサポートされていません:参考 android12_appcache.png

Target sdkを32に上げると、バックグラウンドで前景サービスを開始することが 制限されます


現在、SDK 32で実際にテストしたところ、バックグラウンドで前景サービスを実行することがまだ可能です
バックグラウンドサービスでStartForegroundServiceを実行してみましたが、正常に実行できました。ここは引き続き追跡します

公式には、WorkManagerを使用することを推奨しています: 参考

システムリソースの節約を奨励するために

アラームマネージャAPIはAndroid 12でSCHEDULE_EXACT_ALARM権限を宣言する必要があります

Android 12以上でモーションセンサーのサンプリングレートに制限が設けられました 参考(英語の公式サイトのみ、中文にはこの段落がありません)

registerListener()を使用してセンサーイベントをモニターするためにセンサーリスナーを登録する場合、最大サンプリングレートは200Hzに制限されます
より高いHZを使用するには、HIGH_SAMPLING_RATE_SENSORS権限を追加する必要があります

Android 12の大まかな位置/正確な位置の動作変更

このバージョンでは、大まかな位置/正確な位置の権限を要求する際に、
ACCESS_FINE_LOCATIONACCESS_COARSE_LOCATIONの両方を同時に要求する必要があります。
そうすることで、新しい位置権限要求ボックスが表示されます。
詳細はこちら: 参考

Android 12でのBluetooth権限の分離

以前はBluetooth関連のAPIを使用する際に、
Manifest.permission.BLUETOOTH_ADMINManifest.permission.ACCESS_FINE_LOCATIONを宣言して
近くのBluetoothデバイスを検索していました。

startDiscoveryなどのAPIを使用して近くのデバイスを検索する場合、
古い権限を使用すると、Target 32でAPIが失敗するか、一部のAPIが直接クラッシュします
android12_ble.png

以下のように修正できます:

  1. 古い権限にandroid:maxSdkVersion="30"を追加
  2. 必要に応じて新しい権限BLUETOOTH_CONNECTBLUETOOTH_SCAN、またはBLUETOOTH_ADVERTISEを宣言 android12_ble.png
  3. 以前はランタイム権限要求でACCESS_FINE_LOCATION権限のみを要求していましたが、現在は分離されており、ランタイム時に上記のBluetooth権限要求を追加する必要があります

参考 APIドキュメント およびBluetooth権限分離の説明
ここでは、どのように変更するかの簡単なデモです

You might also enjoy