在飛行模式下,設備仍然可以訪問某些傳感器以啟用特定功能,例如屏幕旋轉和拍照。 Android 10 提供了一個開發者選項設置來關閉設備中的所有傳感器。此功能可幫助開發人員在這些傳感器不可用的情況下測試其應用程序的功能,並為用戶提供一種控制其設備中傳感器的方法。
當開發人員或用戶在開發人員選項(設置>系統>開發人員選項>快速設置開發人員磁貼)中啟用傳感器關閉時,快速設置托盤中會出現一個新磁貼。他們可以使用磁貼來阻止應用訪問攝像頭、麥克風和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
回調。啟用Sensors off 時,將調用onError
回調,並將CameraDevice.StateCallback.ERROR_CAMERA_DISABLED
設置為錯誤值。更新任何第一方應用程序以使用此值處理onError
回調,方法是在後續的openCamera
調用成功之前不對CameraDevice
進行任何後續調用。
傳感器行為
啟用“關閉傳感器”後,傳感器將停止向系統或應用程序報告任何數據。當啟用Sensors off時,應用程序仍然可以請求傳感器並註冊偵聽器,但要么為麥克風返回靜音,要么永遠不會為傳感器調用onSensorChanged
回調。一旦磁貼被禁用,這些相同的偵聽器就會開始接收來自麥克風的實際輸出或對onSensorChanged
的預期回調,而無需做任何額外的工作。靜音傳感器的默認行為如下。
相機
如果啟用Sensors off時應用正在使用攝像頭,則會向onError
回調方法發送錯誤並關閉CameraDevice
。
如果應用程序在啟用Sensors off時嘗試訪問攝像頭,則會向onError
回調方法發送錯誤。
麥克風
啟用“關閉傳感器”後,仍然可以訪問麥克風,但只會返回靜音。如果啟用傳感器關閉時應用程序正在使用麥克風,則不會生成錯誤,但錄音會靜音並僅返回零數組。如果在應用程序仍在使用麥克風時禁用傳感器關閉,則會返回預期的音頻數據。
如果應用程序在啟用傳感器關閉時嘗試訪問麥克風,麥克風會返回靜音。
傳感器
當啟用Sensors off時應用程序嘗試訪問其他傳感器時,傳感器類型會影響默認行為:
- 連續傳感器:處於此報告模式的傳感器停止調度事件。如果啟用傳感器關閉時應用程序正在與連續傳感器交互,則傳感器不會向應用程序發送其他數據,直到該功能被禁用。
- 刷新事件:當啟用磁貼並調用
onFlushComplete
回調以指示請求的刷新成功完成時,可以請求傳感器刷新,但不會生成帶有傳感器數據的新事件並返回到onSensorChanged
回調。 - 更改事件:啟用Sensors off 時,不會報告新的更改事件。
- 觸發事件:啟用Sensors off 時,觸發事件停止生成。任何現有事件都已完成。
定制
如果您的設備使用SensorService
、 CameraService
和AudioPolicyService
的默認實現,則無需對參考設計進行額外定制。但是,您可以支持在SensorManager
之外管理的傳感器,從您的設備中刪除傳感器,或更改開發人員快速設置磁貼的系統 UI 或傳感器關閉磁貼的圖標。
支持更多傳感器
如果您的設備包含在SensorManager
之外管理的傳感器,您應該使用SensorPrivacyService
和SensorPrivacyManager
添加對它們的支持。
當傳感器關閉磁貼被切換時, SensorPrivacyService
為所有註冊的偵聽器調用單向回調。收到此回調後,註冊的偵聽器可以根據圖塊的狀態採取必要的步驟。如果啟用,所有現有連接都可以終止並返回空數據,並設置一個標誌以防止新連接。如果它被禁用,則可以重置該標誌以允許新連接。以相機服務( platform/frameworks/av/services/camera/libcameraservice/
)為例,按照以下步驟添加對新傳感器的支持。
- 實現
BnSensorPrivacyListener
接口。有關更多詳細信息,請參閱SensorPrivacyPolicy
中的CameraService.h
。 - 向
SensorPrivacyManager
註冊並在啟動時獲取磁貼的狀態。有關更多詳細信息,請參閱 CameraService.cpp 中的CameraService.cpp
SensorPrivacyPolicy::registerSelf
。 - 在回調中處理傳感器關閉狀態更改。有關更多詳細信息,請參閱 CameraService.cpp 中的
SensorPrivacyPolicy::onSensorPrivacyChanged
和CameraService::blockAllClients
CameraService.cpp
。 - 啟用磁貼時防止訪問傳感器數據。有關更多詳細信息,請參閱 CameraService.cpp 中的
CameraService.cpp
CameraService::validateClientPermissionsLocked
中的傳感器隱私策略檢查。
卸下傳感器
作為用於測試的開發人員工具,傳感器關閉是隱藏的,因為用戶必須首先啟用開發人員模式,然後選擇使磁貼在設置中可用。
如果您不想在您的設備上支持關閉傳感器,請從packages/apps/Settings/AndroidManifest.xml
中刪除服務標籤。如果您刪除服務標籤,傳感器關閉磁貼將無法從開發人員快速設置磁貼頁面啟用。
從 UI 中更改傳感器
可以為Sensors off UI 自定義兩個元素:開發人員快速設置磁貼顯示的圖標和啟用磁貼時狀態欄中顯示的圖標。要自定義這些圖標的外觀,請替換以下文件:
- 快速設置磁貼圖標:
packages/apps/Settings/res/drawable/tile_icon_sensors_off.xml
- 狀態欄圖標:
frameworks/base/packages/SystemUI/res/drawable/stat_sys_sensors_off.xml
驗證
作為可選的開發人員工具,此功能沒有 CTS 測試。
您可以通過從 Google Play 安裝一個應用程序來手動測試,該應用程序讀取並顯示設備的所有傳感器。當您啟用“傳感器關閉”磁貼時,請確保傳感器的任何值均未更改,麥克風音頻無聲,並且無法訪問攝像頭。