已關閉感應器

在飛航模式下,裝置仍可存取部分感應器,以啟用特定功能,例如螢幕旋轉和拍照。Android 10 提供開發人員選項設定,可關閉裝置中的所有感應器。這項功能可協助開發人員在這些感應器無法運作時測試應用程式功能,並提供使用者控制裝置中感應器的方法。

開發人員或使用者在開發人員選項中啟用「Sensors off」時 (依序前往「設定」 >「系統」 >「開發人員選項」 >「Quick settings developer tiles」),快速設定匣中就會顯示新的圖塊。他們可以使用資訊方塊,防止應用程式存取攝影機、麥克風和 SensorManager 類別管理的所有感應器。

警告:這個選項只會影響透過 `SensorService`、`CameraService` 和 `AudioPolicyService` 存取感應器的應用程式。通訊功能不會使用 `AudioPolicyService`,因此在通話期間仍可存取麥克風。

實作

Android 10 包含參考實作項目,可處理攝影機、麥克風和 SensorManager 感應器。管理「Sensors off」狀態並通知用戶端狀態變更的系統服務位於 frameworks/base/services/core/java/com/android/server/SensorPrivacyService.java 中。在應用程式結構定義中,有個管理員可協助存取 SensorPrivacyServiceframeworks/base/core/java/android/hardware/SensorPrivacyManager.java

如果您的裝置使用 SensorServiceCameraServiceAudioPolicyService 的預設實作方式,則參考設計無須額外自訂。如果您有其他感應器,請參閱「自訂」一節,進一步瞭解如何支援這項功能。

常見問題

實作這項功能時,相機應用程式在首次嘗試取得相機和相機無法使用時,有時不會正確回應 onError 回呼。這通常會導致啟用此資訊方塊時應用程式當機,但這可用做為信號,表示該功能的運作情況符合預期。

這項行為表示應用程式未正確處理 CameraDevice.StateCallback 中的 onError 回呼。啟用「Sensors off」時,系統會呼叫 onError 回呼,並將 CameraDevice.StateCallback.ERROR_CAMERA_DISABLED 設為錯誤值。更新任何第一方應用程式,以便在後續 openCamera 呼叫成功之前,不要對 CameraDevice 進行任何後續呼叫,以便處理此值的 onError 回呼。

感應器行為

啟用「Sensors off」後,感應器就會停止向系統或應用程式回報任何資料。啟用「Sensors off」時,應用程式仍可要求感應器並註冊事件監聽器,但麥克風會傳回靜音,或是系統永遠不會為感應器叫用 onSensorChanged 回呼。只要停用資訊方塊,這些相同的監聽器就會開始接收麥克風的實際輸出內容,或預期的 onSensorChanged 回呼,而不需要執行任何額外工作。靜音感應器的預設行為如下。

相機

如果應用程式在啟用「Sensors off」時使用攝影機,系統會將錯誤傳送至 onError 回呼方法,並關閉 CameraDevice

如果應用程式在啟用「Sensors off」時嘗試存取攝影機,系統會將錯誤傳送至 onError 回呼方法。

麥克風

啟用「感應器關閉」後,應用程式仍可存取麥克風,但只會傳回靜音。如果應用程式在啟用「Sensors off」 時使用麥克風,系統不會產生錯誤,但錄音會靜音,並只傳回零陣列。如果應用程式仍在使用麥克風時停用「感應器關閉」,系統會傳回預期的音訊資料。

如果應用程式在啟用「感應器關閉」時嘗試存取麥克風,麥克風會傳回靜音。

感應器

當應用程式在啟用「感應器關閉」時嘗試存取其他感應器時,感應器類型會影響預設行為:

  • 持續性感應器:在這個回報模式下,感應器會停止調度事件。如果應用程式在啟用「Sensors off」時與持續感應器互動,感應器就不會向應用程式傳送其他資料,直到關閉這項功能為止。
  • 清除事件:啟用資訊方塊並叫用 onFlushComplete 回呼時,可以要求清除感應器,以表示要求的清除作業已成功完成,但不會產生任何含有感應器資料的新事件,也不會傳回至 onSensorChanged 回呼。
  • 變更事件:啟用「感應器關閉」時,系統不會回報任何新的變更事件。
  • 觸發事件:啟用「Sensors off」後,系統就會停止產生觸發事件。所有現有事件都已完成。

自訂

如果您的裝置使用 SensorServiceCameraServiceAudioPolicyService 的預設實作方式,則參考設計無須額外自訂。不過,您可以支援在 SensorManager 之外管理的感應器、從裝置中移除「Sensors off」,或變更開發人員快速設定圖塊的系統 UI,或是「Sensors off」圖塊的圖示。

支援更多感應器

如果裝置包含在 SensorManager 以外管理的感應器,您應使用 SensorPrivacyServiceSensorPrivacyManager 為這些感應器新增支援功能。

切換「Sensors off」圖塊後,SensorPrivacyService 會針對所有已註冊的監聽器叫用單向回呼。收到此回呼時,已註冊的事件監聽器可以根據資訊方塊的狀態採取必要步驟。如果啟用,系統可以終止所有現有連線並傳回空白資料,並設定標記來防止新的連線。如果已停用,則可以重設標記,允許新的連線。以攝影機服務 (platform/frameworks/av/services/camera/libcameraservice/) 為例,請按照下列步驟新增對新感應器的支援。

  1. 執行 BnSensorPrivacyListener 介面。詳情請參閱 CameraService.h 中的 SensorPrivacyPolicy
  2. 請向 SensorPrivacyManager 註冊,並在啟動時取得資訊方塊的狀態。詳情請參閱 CameraService.cpp 中的 SensorPrivacyPolicy::registerSelf
  3. 在回呼中處理「Sensors off」狀態變更。詳情請參閱 CameraService.cpp 中的 SensorPrivacyPolicy::onSensorPrivacyChangedCameraService::blockAllClients
  4. 啟用資訊方塊時,可防止存取感應器資料。詳情請參閱 CameraService.cpp 中的 CameraService::validateClientPermissionsLocked 中所列的「感應器隱私權政策」檢查項目。

移除「已關閉感應器」

Sensors off 是用於測試的開發人員工具,因此會隱藏,因為使用者必須先啟用開發人員模式,然後選擇在設定中提供資訊方塊。

如果您不想在裝置上支援「Sensors off」,請從 packages/apps/Settings/AndroidManifest.xml 中移除服務標記。如果移除服務標記,就無法透過開發人員快速設定圖塊頁面啟用「Sensors off」圖塊。

變更「感應器已關閉」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 安裝可讀取及顯示所有裝置感應器的應用程式,以便手動測試。啟用「Sensors off」資訊方塊時,請確認感應器的值不會變更、麥克風音訊不會發出聲響,且攝影機無法使用。