在飛行模式下,設備仍然可以存取某些感測器來啟用特定功能,例如螢幕旋轉和拍照。 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
回呼。當啟用感測器關閉時,將呼叫onError
回調,並將CameraDevice.StateCallback.ERROR_CAMERA_DISABLED
設定為錯誤值。更新任何第一方應用程式以使用此值處理onError
回調,方法是在後續openCamera
呼叫成功之前不對CameraDevice
進行任何後續呼叫。
感測器行為
啟用「感測器關閉」後,感測器將停止向系統或應用程式報告任何數據。當啟用「感測器關閉」時,應用程式仍然可以請求感測器並註冊偵聽器,但要么為麥克風返回靜音,要么永遠不會為感測器調用onSensorChanged
回調。一旦停用該圖塊,這些相同的偵聽器就開始接收來自麥克風的實際輸出或對onSensorChanged
預期回調,而無需執行任何其他工作。靜音感測器的預設行為如下。
相機
如果應用程式在啟用Sensors off的情況下使用相機,則會向onError
回呼方法發送錯誤,並且CameraDevice
會關閉。
如果應用程式在啟用感測器關閉時嘗試存取相機,則會向onError
回呼方法發送錯誤。
麥克風
啟用“感應器關閉”後,仍然可以存取麥克風,但僅返回靜音。如果應用程式在啟用「感測器關閉」時使用麥克風,則不會產生錯誤,但錄音會靜音並僅傳回零數組。如果在應用程式仍在使用麥克風時停用感測器關閉,則會返回預期的音訊資料。
如果應用程式在啟用感應器關閉時嘗試存取麥克風,麥克風將返回靜音。
感應器
當應用程式在啟用感測器關閉時嘗試存取其他感測器時,感測器類型會影響預設行為:
- 連續感測器:處於此報告模式的感測器停止調度事件。如果在啟用「感測器關閉」時應用程式正在與連續感測器交互,則在停用該功能之前,感測器不會向應用程式發送其他資料。
- 刷新事件:啟用磁貼並呼叫
onFlushComplete
回呼以指示請求的刷新已成功完成時,可以請求感測器刷新,但不會產生帶有感測器資料的新事件並將其返回到onSensorChanged
回調。 - 更改事件:啟用「感測器關閉」時,不會報告新的更改事件。
- 觸發事件:當啟用感測器關閉時,觸發事件停止產生。任何現有事件均已完成。
客製化
如果您的裝置使用SensorService
、 CameraService
和AudioPolicyService
的預設實現,則無需對參考設計進行額外的自訂。但是,您可以支援在SensorManager
外部管理的感測器,從裝置中刪除感測器,或更改開發人員快速設定圖塊的系統 UI 或感測器關閉圖塊的圖示。
支援更多感測器
如果您的裝置包含在SensorManager
外部管理的感測器,則應使用SensorPrivacyService
和SensorPrivacyManager
新增對它們的支援。
當感測器關閉磁貼被切換時, SensorPrivacyService
會為所有註冊的偵聽器呼叫單向回呼。收到此回呼後,已註冊的偵聽器可以根據圖塊的狀態採取必要的步驟。如果啟用,則可以終止所有現有連線並傳回空數據,並設定一個標誌以阻止新連線。如果停用,則可以重設該標誌以允許新連線。以相機服務 ( platform/frameworks/av/services/camera/libcameraservice/
) 為例,請依照下列步驟新增對新感測器的支援。
- 實作
BnSensorPrivacyListener
介面。有關更多詳細信息,請參閱CameraService.h
中的SensorPrivacyPolicy
。 - 向
SensorPrivacyManager
註冊並在啟動時取得磁貼的狀態。有關更多詳細信息,請參閱CameraService.cpp
中的SensorPrivacyPolicy::registerSelf
。 - 在回調中處理感測器關閉狀態變化。有關更多詳細信息,請參閱
CameraService.cpp
中的SensorPrivacyPolicy::onSensorPrivacyChanged
和CameraService::blockAllClients
。 - 啟用磁貼時防止存取感測器資料。有關更多詳細信息,請參閱
CameraService.cpp
中的CameraService::validateClientPermissionsLocked
中的感測器隱私策略檢查。
移除感應器關閉
作為用於測試的開發人員工具, Sensors off是隱藏的,因為使用者必須先啟用開發人員模式,然後選擇在設定中使磁貼可用。
如果您不想在裝置上支援關閉感應器,請從packages/apps/Settings/AndroidManifest.xml
中刪除服務標籤。如果刪除服務標籤,則無法從開發人員快速設定磁貼頁面啟用「感測器關閉」磁貼。
更改 UI 中的感測器
可以為感測器關閉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 中的應用程式來手動測試,該應用程式可讀取並顯示裝置的所有感測器。當您啟用「感應器關閉」磁貼時,請確保感應器的任何值均未變更、麥克風音訊保持靜音且無法存取攝影機。