Android 下拉欄中的禁用攝像頭和麥克風隱藏
文章目錄
- Android 下拉欄中的禁用攝像頭和麥克風隱藏
- 一、前言
- 二、下拉框中的禁用攝像頭和麥克風隱藏實現
- 1、設置支持屬性為false
- 2、修改代碼
- 三、其他
- 1、下拉欄中的禁用攝像頭和麥克風隱藏小結
- 2、 Android SensorPrivacyService
- ps: 成功最重要的原因是明確的目標、不懈的努力與適應變化的能力三者相結合。
一、前言
Android下拉欄中有攝像頭和麥克風禁用功能;
但是點擊禁用后會有些bug,比方多視窗異常,信源聲音異常等問題;
所以目前做法是直接隱藏掉禁用功能,算是規避手段了,
出現問題就不問題刪除,哈哈,當然如果有能力和時間去解決這個問題是更好的;
市場上大部分手機上應該是解決了這些問題的,也可能是在某些場景進行了優化;
我這里開發的是大屏設備,沒有手機那么多顧慮和要求所以隱藏UI是目前最好的做法。
如果你也有隱藏下拉欄UI或者簡單修改下拉框UI的需要可以看看本文。
Android 系統下拉欄的主要代碼的目錄:
frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar
如 StatusBar.java
是狀態欄和下拉通知欄的核心類,負責管理通知欄的顯示、隱藏、滑動等邏輯;
NotificationPanelView.java
用于處理通知欄的布局和繪制等。
本文不涉及復雜邏輯的修改,只是隱藏圖標,并且系統中大部分圖標都是有res屬性可以控制是否隱藏的;
但是3588 Android15 中設置這個屬性未生效,后面在代碼中直接進行了修改。
二、下拉框中的禁用攝像頭和麥克風隱藏實現
1、設置支持屬性為false
+++ frameworks/base/core/res/res/values/config.xml
@@ -127,9 +127,9 @@<bool name="config_supportPreRebootSecurityLogs">true</bool><!-- Whether this device is supporting the software microphone toggle -->
- <bool name="config_supportsMicToggle">true</bool>
+ <bool name="config_supportsMicToggle">false</bool><!-- Whether this device is supporting the camera toggle -->
- <bool name="config_supportsCamToggle">true</bool>
+ <bool name="config_supportsCamToggle">false</bool>
正常情況修改framework 中的config屬性為false就行了;
但是也有些系統方案存在overlay覆蓋的情況;一般是vendor 或者device 目錄會有
比如RK3588 中的overlay目錄:
device/rockchip/common/overlay/frameworks/base/core/res/res/values/config.xml
之前在Android13 的這個目錄修改是生效的,但是在Android15 上修改就不行了;
搜索整個源碼目錄的 config_supportsMicToggle 關鍵字,能修改的幾個都修改了,也是沒有起作用;
所以需要看看代碼是哪里獲取的嘗試確認并修改。
2、修改代碼
frameworks/base/services/core/java/com/android/server/sensorprivacy/SensorPrivacyService.java
@@ -1289,13 +1289,16
@@ public final class SensorPrivacyService extends SystemService {@Overridepublic boolean supportsSensorToggle(int toggleType, int sensor) {
+ //change by skg
+ Log.d(TAG,"lwz supportsSensorToggle toggleType = " + toggleType + ", sensor = " + sensor);
+
+ Log.d(TAG,"lwz supportsSensorToggle config_supportsMicToggle = " + mContext.getResources().getBoolean(R.bool.config_supportsMicToggle) +
+ ", config_supportsCamToggle = " + mContext.getResources().getBoolean(R.bool.config_supportsCamToggle));if (toggleType == TOGGLE_TYPE_SOFTWARE) {if (sensor == MICROPHONE) {
- return mContext.getResources().getBoolean(R.bool.config_supportsMicToggle);
+ return false;//mContext.getResources().getBoolean(R.bool.config_supportsMicToggle);} else if (sensor == CAMERA) {
- return mContext.getResources().getBoolean(R.bool.config_supportsCamToggle);
+ return false;//mContext.getResources().getBoolean(R.bool.config_supportsCamToggle);}} else if (toggleType == TOGGLE_TYPE_HARDWARE) {if (sensor == MICROPHONE) {
從代碼看可以看到是否支持確實是從res屬性中進行獲取和判斷;
上面強制返回了false,表示不支持;
并且從打印日志查看,雖然res屬性設置了false,但是打印的日志還是獲取到顯示true;
難道存在有打包的gms overlayapk會進行屬性覆蓋?暫時不確定。
三、其他
1、下拉欄中的禁用攝像頭和麥克風隱藏小結
正常情況設置framework config屬性就行:
<bool name="config_supportsMicToggle">false</bool>
<bool name="config_supportsCamToggle">false</bool>
也有可能存在overlay的情況,需要修overlay的屬性。
如果修改config資源無效,可以嘗試修改Java文件:
frameworks/base/services/core/java/com/android/server/sensorprivacy/SensorPrivacyService.javapublic boolean supportsSensorToggle(int toggleType, int sensor) {return false;}
SensorPrivacyService 只控制隱私的攝像頭和麥克風,下拉欄的其他屬性不在這里控制。
2、 Android SensorPrivacyService
Android SensorPrivacyService
是 Android 系統中負責傳感器隱私管理的服務,其主要作用如下:
**保護用戶隱私**:它通過限制應用對傳感器數據的訪問,來防止應用在用戶不知情的情況下獲取敏感信息,從而保護用戶的隱私。
例如,在用戶未授權時,阻止應用訪問位置傳感器、攝像頭、麥克風等傳感器,避免位置信息、圖像、語音等數據被泄露。
簡單的說SensorPrivacyService 就是一個系統服務,開機回初始化,會控制和監聽攝像頭和麥克風的是否使用授權;
這個SensorPrivacyService的代碼不多只有一千多行;里面還有兩個Settings屬性的監聽:
Settings.Secure.DEFAULT_INPUT_METHOD 在 Android 系統的輸入法管理中起著關鍵的作用,它是連接用戶設置、系統輸入法切換以及應用與輸入法交互的重要紐帶。Settings.Global.RECEIVE_EXPLICIT_USER_INTERACTION_AUDIO_ENABLED 是 Android 系統設置中的一個全局屬性,用于控制是否允許應用在接收到明確的用戶交互后播放音頻。