機内モードの場合、デバイスは引き続き一部のセンサーにアクセスして、画面の回転や写真撮影などの特定の機能を有効にできます。Android 10 には、デバイス内のすべてのセンサーをオフにする開発者向けオプションの設定が用意されています。この機能は、センサーを使用できなくなった状況下におけるアプリの機能をテストするのに役立ちます。ユーザーに対してデバイス内のセンサーを制御する方法にもなります。
デベロッパーまたはユーザーが開発者向けオプションで [センサー OFF] を有効にすると([設定] > [システム] > [開発者向けオプション > クイック設定開発者用タイル)、クイック設定トレイに新しいタイルが表示されます。そのタイルを使用することで、アプリが SensorManager クラスで管理されるカメラ、マイク、すべてのセンサーにアクセスできないようにします。
警告: このオプションは、「SensorService」、「CameraService」、「AudioPolicyService」を通じてセンサーにアクセスするアプリにのみ影響します。電話機能は「AudioPolicyService」を使用せず、通話中にマイクにアクセスできます。
実装
Android 10 には、カメラ、マイク、SensorManager のセンサーを処理するリファレンス実装が含まれています。センサーオフの状態を管理し、状態の変更をクライアントに通知するシステム サービスは frameworks/base/services/core/java/com/android/server/SensorPrivacyService.java にあります。アプリのコンテキスト内の SensorPrivacyService へのアクセスを可能にするマネージャーは、frameworks/base/core/java/android/hardware/SensorPrivacyManager.java にあります。
デバイスが、SensorService、CameraService、AudioPolicyService のデフォルトの実装を使用する場合、参照設計に対する追加のカスタマイズは必要ありません。他のセンサーを搭載している場合は、この機能のサポートに関する詳細について、カスタマイズをご覧ください。
よくある問題
この機能を実装する場合、最初にカメラを取得しようとするとき、またはカメラが利用できなくなったときに、カメラアプリが onError コールバックに正しく応答しないことがあります。このタイルが有効な場合、正しく応答できないことでアプリがクラッシュしますが、これは機能が意図したとおりに動作していることを示します。
この動作は、アプリが CameraDevice.StateCallback で onError コールバックを適切に処理していないことを示します。[センサー OFF] を有効にすると、CameraDevice.StateCallback.ERROR_CAMERA_DISABLED がエラー値として設定され他状態で onError コールバックが呼び出されます。後続の openCamera 呼び出しが成功するまで CameraDevice に対しての後続の呼び出しを行わないようにして、この値で onError コールバックを処理するようにすべてのファーストパーティ製アプリを更新します。
センサーの動作
[センサー OFF] を有効にすると、センサーからシステムやアプリにデータが一切送信されなくなります。[センサー OFF] が有効になっていても、アプリは引き続きセンサーをリクエストしてリスナーを登録できますが、マイクに対しては無音が返されるか、onSensorChanged コールバックがセンサーのために呼び出されることはありません。タイルを無効にするとすぐに、これらの同じリスナーはマイクからの実際の出力、または onSensorChanged への想定されるコールバックを受信するようになります。無効にした後に特別な操作は必要ありません。無音のセンサーのデフォルトの動作は次のとおりです。
カメラ
[センサー OFF] が有効になっているときにアプリがカメラを使用している場合、エラーが onError コールバック メソッドに送信され、CameraDevice が終了します。
[センサー OFF] が有効になっているときにアプリがカメラにアクセスしようとすると、エラーが onError コールバック メソッドに送信されます。
マイク
[センサー OFF] が有効になっている場合でも、マイクへのアクセスは引き続き可能ですが、無音のみが返されます。[センサー OFF] が有効になっているときにアプリがマイクを使用している場合、エラーは発生しませんが、録音は無音になり、ゼロの配列だけが返されます。アプリがまだマイクを使用している最中に [センサー OFF] を無効にすると、想定される音声データが返されます。
[センサー OFF] が有効になっているときにアプリがマイクにアクセスしようとすると、マイクは無音を返します。
センサー
[センサー OFF] が有効になっているときにアプリが他のセンサーにアクセスしようとする場合、デフォルトの動作はセンサータイプによって異なります。
- 連続センサー: このレポートモードのセンサーは、イベントのディスパッチを停止します。[センサー OFF] が有効になっているときにアプリが連続センサーを操作している場合、センサーはこの機能が無効になるまでアプリにそれ以上のデータを送信しません。
- フラッシュ イベント: このタイルが有効になっているときでも、センサーのフラッシュをリクエストできます。リクエストすると、
onFlushCompleteコールバックが呼び出され、リクエストされたフラッシュが正常に完了したものの、センサーデータを使用した新しいイベント生成されず、onSensorChangedコールバックに返されたことが示されます。 - 変更時のイベント: [センサー OFF] が有効になっていると、新しい変更イベントは報告されません。
- トリガー イベント: [センサー OFF] が有効になると、トリガー イベントの生成が停止されます。既存のイベントはすべて完了します。
カスタマイズ
デバイスが、SensorService、CameraService、AudioPolicyService のデフォルトの実装を使用する場合、参照設計に対する追加のカスタマイズは必要ありません。ただし、SensorManager の外部で管理されているセンサーのサポート、デバイスからの [センサー OFF] の削除、クイック設定開発者用タイルのシステム UI または [センサー OFF] タイルのアイコンの変更は可能です。
センサーのサポートを追加する
デバイスに SensorManager の外部で管理されるセンサーが含まれている場合は、SensorPrivacyService と SensorPrivacyManager を使用してそのセンサーに対するサポートを追加する必要があります。
[センサー OFF] タイルが切り替えられると、SensorPrivacyService は登録されたすべてのリスナーに対して一方向コールバックを呼び出します。このコールバックを受信すると、登録されたリスナーはタイルの状態に基づいて必要な手順を実施できます。有効にすると、すべての既存の接続が停止され、空のデータを返し、新しい接続を禁止するフラグが設定されます。無効にすると、フラグをリセットして新しい接続を許可できます。カメラサービス(platform/frameworks/av/services/camera/libcameraservice/)を例として使用して、次の手順で新しいセンサーのサポートを追加します。
BnSensorPrivacyListenerインターフェースを実装します。詳しくは、CameraService.hのSensorPrivacyPolicyをご覧ください。SensorPrivacyManagerに登録し、起動時にタイルの状態を取得します。詳しくは、CameraService.cppのSensorPrivacyPolicy::registerSelfをご覧ください。- コールバックで [センサー OFF] の状態の変更を処理します。詳しくは、
CameraService.cppのSensorPrivacyPolicy::onSensorPrivacyChangedとCameraService::blockAllClientsをご覧ください。 - タイルが有効なときにセンサーデータにアクセスできないようにします。詳しくは、
CameraService.cppのCameraService::validateClientPermissionsLockedのセンサーのプライバシー ポリシーの確認をご覧ください。
[センサー OFF] を削除する
[センサー OFF] はテスト用のデベロッパー ツールであるため、ユーザーが最初にデベロッパー モードを有効にしてから設定でタイルを利用するように選択するまで表示されません。
お使いのデバイスで [センサー OFF] をサポートしない場合は、packages/apps/Settings/AndroidManifest.xml からサービスタグを削除します。このサービスタグを削除すると、クイック設定開発者用タイルのページから [センサー OFF] タイルを有効にできなくなります。
[センサー OFF] の UI を変更する
[センサー OFF] の UI でカスタマイズできる要素は 2 つあります。クイック設定開発者用タイルに表示されるアイコンと、タイルが有効なときにステータスバーに表示されるアイコンです。これらのアイコンのデザインをカスタマイズするには、次のファイルを置き換えます。
- クイック設定タイルのアイコン:
packages/apps/Settings/res/drawable/tile_icon_sensors_off.xml - ステータスバーのアイコン:
frameworks/base/packages/SystemUI/res/drawable/stat_sys_sensors_off.xml
検証
この機能はオプションのデベロッパー ツールであるため、この機能の CTS テストはありません。
デバイスのセンサーをすべて読み取って表示するアプリを Google Play からインストールすることで、手動でテストできます。[センサー OFF] タイルを有効にしたときに、センサーのどの値も変更されず、マイクの音声は消音で、カメラにアクセスできないことを確認してください。