Android 7.1 更改 OtherSound 預設值並隱藏
概述
最近專案需要修改 Android 7.1 中 Settings 中 OtherSound 子選單中各項的預設值,並將其隱藏,在此做下整理。
更改預設值
- 目標 OtherSound子選單中主要有三項,如下表所示。系統中預設這三項為開啟的,根據專案要求需將其預設值改為關閉狀態。
- Charging sounds
- Lockscreen sounds
- Touch sounds
- 做法
(1) 修改 Lockscreen sounds 和 Touch sounds兩項的預設值
修改檔案:\frameworks\base\packages\SettingsProvider\res\values\defaults.xml
<integer name="def_lockscreen_sounds_enabled">0</integer> // Lockscreen sounds 預設值
...
<bool name="def_sound_effects_enabled">false</bool> // Touch sounds 預設值
(2) 修改 Charging sounds 預設值
修改檔案: \packages\apps\Settings\src\com\android\settings\notification\OtherSoundSetting.java
private static final int DEFAULT_OFF = 0; // 新增變數
...
private static final SettingPref PREF_CHARGING_SOUNDS = new SettingPref(
TYPE_GLOBAL, KEY_CHARGING_SOUNDS, Global.CHARGING_SOUNDS_ENABLED, DEFAULT_OFF); // 修改最後一個引數為 DEFAULT_OFF
- 分析 (1) 與 OtherSound選項中預設值設定直接相關的程式碼檔案是 OtherSoundSettings.java。其相關程式碼如下
private static final int DEFAULT_ON = 1; // 定義各項的預設值
...
private static final SettingPref PREF_SCREEN_LOCKING_SOUNDS = new SettingPref(
TYPE_SYSTEM, KEY_SCREEN_LOCKING_SOUNDS, System.LOCKSCREEN_SOUNDS_ENABLED, DEFAULT_ON);
private static final SettingPref PREF_CHARGING_SOUNDS = new SettingPref(
TYPE_GLOBAL, KEY_CHARGING_SOUNDS, Global.CHARGING_SOUNDS_ENABLED, DEFAULT_ON);
private static final SettingPref PREF_TOUCH_SOUNDS = new SettingPref(
TYPE_SYSTEM, KEY_TOUCH_SOUNDS, System.SOUND_EFFECTS_ENABLED, DEFAULT_ON) {
@Override
protected boolean setSetting(final Context context, final int value) {
AsyncTask.execute(new Runnable() {
@Override
public void run() {
final AudioManager am =
(AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
if (value != 0) {
am.loadSoundEffects();
} else {
am.unloadSoundEffects();
}
}
});
return super.setSetting(context, value);
}
};
由以上程式碼可知,各項對應的使能變數如下表
選單項 | 使能變數 |
---|---|
Charging sounds | Global.CHARGING_SOUNDS_ENABLED |
Lockscreen sounds | System.LOCKSCREEN_SOUNDS_ENABLED |
Touch sounds | System.SOUND_EFFECTS_ENABLED |
(2) 由上可知,各項的值設定是由類 SettingPref 來完成的,SettingsPref.java(該檔案與OtherSoundSettings.java 在同個目錄下)的相關程式碼如下
// 建構函式
public SettingPref(int type, String key, String setting, int def, int... values) {
mType = type; // Global 或 System,預設值獲取的位置
mKey = key; // 子項鍵名
mSetting = setting; // 設定標識
mDefault = def; // 預設值
mValues = values;
mUri = getUriFor(mType, mSetting);
}
// 從系統獲取子項的值並更新 UI
public void update(Context context) {
final int val = getInt(mType, context.getContentResolver(), mSetting, mDefault);
if (mTwoState != null) {
mTwoState.setChecked(val != 0);
} else if (mDropDown != null) {
mDropDown.setValue(Integer.toString(val));
}
}
// 獲取選項的值
protected static int getInt(int type, ContentResolver cr, String setting, int def) {
switch(type) {
case TYPE_GLOBAL:
return Global.getInt(cr, setting, def);
case TYPE_SYSTEM:
return System.getInt(cr, setting, def);
}
throw new IllegalArgumentException();
}
從以上可知,子項的值是通過 Global.getInt 或 System.getInt 獲取的,即從資料庫獲取,若資料庫的值為空,則將值設為 def
(3) 修改資料庫中相關項的值,相關的檔案分別為 DatabaseHelper.java 和 defaults.xml 檔案位置: \frameworks\base\packages\SettingsProvider\res\values\defaults.xml \frameworks\base\packages\SettingsProvider\src\com\android\providers\settings\DatabaseHelper.java
// 在 DatabaseHelper.java 中尋找各項在配置檔案中的 id
loadIntegerSetting(stmt, Settings.System.LOCKSCREEN_SOUNDS_ENABLED,
R.integer.def_lockscreen_sounds_enabled); // 由此可知 lockscreen sounds 在配置檔案中的id 為 def_lockscreen_sounds_enabled
loadBooleanSetting(stmt, Settings.System.SOUND_EFFECTS_ENABLED,
R.bool.def_sound_effects_enabled); // 由此可知 touch sounds 在配置檔案中的id 為 def_sound_effects_enabled
<!-- 修改 defaults.xml -->
<!-- Default for UI lockscreen sounds enabled-->
<integer name="def_lockscreen_sounds_enabled">0</integer>
<!-- Default for UI touch sounds enabled-->
<bool name="def_sound_effects_enabled">false</bool>
以上修改便可以完成 lockscreen sounds 和 touch sounds 預設值的修改。
(4) 因 charging sounds 的預設值並沒有在 defaults.xml 中設定,通過 getInt 中獲取的是 def 變數的值,因此要修改 charging sounds,只需定義變數 DEFAULT_OFF=0,並將該變數傳入 SettingPref 的構造器中即可完成更改。
隱藏 OtherSound
OtherSound 位於 Sound 選單下,將其的隱藏只需在 SoundSetting.java 中將其移除就好。
// 新增變數
private static final String KEY_OTHER_SOUNDS = "other_sounds";
// 在 OnCreate中將其移除
removePreference(KEY_OTHER_SOUNDS);