Android 12 開発におけるバージョン差異への対応方法:重要なコツを公開!
この記事では、私の開発経験を共有し、
Android バージョンアップによる課題とその解決策について探ります。
私が直面した問題を分析することで、
開発プロセスで同様の問題に直面した際に役立つ洞察を提供できればと思います。
公式の変更点を確認したい場合は、
Android 12 に影響を受ける機能
カメラの権限をオンにしても、
ユーザーがカメラのアクセス権をオフにすると、
カメラは黒い画面を表示します。
マイクも同様です:参考
- 現在、システムがサポートしているかどうかを検出するためのコードがあり、ユーザーに通知することができますが、オンになっているかどうかを判断するAPIはまだ見つかっていません。
-
以下のようにデフォルトのアイコンの起動画面が追加されました

-
実際にテストしたところ、このデフォルトのスプラッシュ画面を削除する方法は提供されていません。
以前のカスタムActivityを削除しても画面は表示されませんが、以前のサイクルは実行されます。
公式も新しいスプラッシュ画面に関するいくつかの仕様を提供しています:参考
-
調整方法:
implementation 'androidx.core:core-splashscreen:1.0.0'をbuild.gradleに追加します
ここで注意すべきは、min sdkの要件が21以上であることです

- 新しいスプラッシュ画面のテーマを設定します
windowSplashScreenBackgroundは背景色で、実際に設定できるのは@colorのみですwindowSplashScreenAnimatedIconは中央の円形ビューのアイコンで、画像を設定できますが、サイズは公式が発表したものに従う必要がありますwindowSplashScreenBrandingImageはアイコンの下にある小さな背景画像ですwindowSplashScreenAnimationDurationはアニメーションの時間です-
新しいSplashThemeを
AndrodManifest.xmlに追加 -
初期コードを追加
SplashScreen.installSplashScreen(this)はsuper.onCreateの前に必要splashScreen.setKeepOnScreenCondition(() -> true );この行は、元の古いアクティビティ画面を表示しないが、アクティビティのライフサイクルは実行されるようにします
ただし、この方法は新しい公式のスプラッシュを使用するため、元のカスタマイズされた画面は表示されません。ここは各
プロダクトオーナーが自行考量してください
-
図のように、コンパイル後にインストールしようとすると、次のような
INSTALL_PARSE_FAILED_MANIFEST_MALFORMEDエラーが表示されます
-
また、PendingIntentを使用する場合も対応するフラグを追加しないとエラーが発生します:
-
解決方法&デモ:
-
各PendingIntent作成箇所に
FLAG_IMMUTABLEまたはFLAG_MUTABLEタグを追加する必要があります -
最新のwork-runtimeを追加:
implementation 'androidx.work:work-runtime:2.7.1'

-
備考
- ここではAirdroidを例にしていますが、現在Airdroid & httphelperリポジトリは分かれているため、他の箇所も修正が必要です
- 隠れたPendingIntentも修正が必要で、implementされたライブラリ内でもPendingIntentが使用されています
現在の
Airdroidプロジェクト内で使用されているGoogle Analytics 17.0.0バージョンでもエラーメッセージが表示されます (このような場合、実際にそのコードを実行してみないとPendingIntentのエラーがあるかどうかわかりません)
この場合、バージョンを上げるだけで解決します
implementation 'com.google.android.gms:play-services-analytics:18.0.1'
-
Chromiumがこの機能を削除したため、sdkはもはやサポートされていません:参考

現在、SDK 32で実際にテストしたところ、バックグラウンドで前景サービスを実行することがまだ可能です
バックグラウンドサービスでStartForegroundServiceを実行してみましたが、正常に実行できました。ここは引き続き追跡します
公式には、WorkManagerを使用することを推奨しています: 参考
アラームマネージャAPIはAndroid 12でSCHEDULE_EXACT_ALARM権限を宣言する必要があります
registerListener()を使用してセンサーイベントをモニターするためにセンサーリスナーを登録する場合、最大サンプリングレートは200Hzに制限されます
より高いHZを使用するには、HIGH_SAMPLING_RATE_SENSORS権限を追加する必要があります
このバージョンでは、大まかな位置/正確な位置の権限を要求する際に、
ACCESS_FINE_LOCATIONとACCESS_COARSE_LOCATIONの両方を同時に要求する必要があります。
そうすることで、新しい位置権限要求ボックスが表示されます。
詳細はこちら: 参考
Manifest.permission.BLUETOOTH_ADMINとManifest.permission.ACCESS_FINE_LOCATIONを宣言して
近くのBluetoothデバイスを検索していました。
startDiscoveryなどのAPIを使用して近くのデバイスを検索する場合、
古い権限を使用すると、Target 32でAPIが失敗するか、一部のAPIが直接クラッシュします

以下のように修正できます:
- 古い権限に
android:maxSdkVersion="30"を追加 - 必要に応じて新しい権限
BLUETOOTH_CONNECT、BLUETOOTH_SCAN、またはBLUETOOTH_ADVERTISEを宣言
- 以前はランタイム権限要求で
ACCESS_FINE_LOCATION権限のみを要求していましたが、現在は分離されており、ランタイム時に上記のBluetooth権限要求を追加する必要があります
参考 APIドキュメント およびBluetooth権限分離の説明
ここでは、どのように変更するかの簡単なデモです