Android 12 開発におけるバージョン差異への対応方法:重要なコツを公開!
この記事では、私の開発経験を共有し、
Android バージョンアップによる課題とその解決策について探ります。
私が直面した問題を分析することで、
開発プロセスで同様の問題に直面した際に役立つ洞察を提供できればと思います。
公式の変更点を確認したい場合は、
直接
Android Developer をご覧ください
- ユーザーはスタートバー内のクイックボタンや設定内の
カメラまたはマイクのアクセス権
のスイッチを使用してオン/オフを切り替えることができます -
カメラの使用体験に影響を与える可能性があります。
カメラの権限をオンにしても、
ユーザーがカメラのアクセス権をオフにすると、
カメラは黒い画面を表示します。
マイクも同様です:参考 - 現在、システムがサポートしているかどうかを検出するためのコードがあり、ユーザーに通知することができますが、オンになっているかどうかを判断するAPIはまだ見つかっていません。
- しかし、Android 13では
アクセシビリティ権限
をオンにすると、ACTION_CLOSE_SYSTEM_DIALOGS を送信できますが、オフにするとこのブロードキャストは受信されません。
- 以下のようにデフォルトのアイコンの起動画面が追加されました
-
実際にテストしたところ、このデフォルトのスプラッシュ画面を削除する方法は提供されていません。
以前のカスタム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'
- 各PendingIntent作成箇所に
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
の両方を同時に要求する必要があります。
そうすることで、新しい位置権限要求ボックスが表示されます。
詳細はこちら: 参考
以前はBluetooth関連のAPIを使用する際に、
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権限分離の説明
ここでは、どのように変更するかの簡単なデモです