1. 程式人生 > >Android 7.1 更改 OtherSound 預設值並隱藏

Android 7.1 更改 OtherSound 預設值並隱藏

概述

最近專案需要修改 Android 7.1 中 Settings 中 OtherSound 子選單中各項的預設值,並將其隱藏,在此做下整理。

更改預設值

  1. 目標 OtherSound子選單中主要有三項,如下表所示。系統中預設這三項為開啟的,根據專案要求需將其預設值改為關閉狀態。
  • Charging sounds
  • Lockscreen sounds
  • Touch sounds
  1. 做法

(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. 分析 (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);

參考連結