ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

SettingsProvider defaults.xml 修改默认值数据及更新数据

2020-04-25 22:04:17  阅读:933  来源: 互联网

标签:xml defaults settings private key 默认值 SettingsProvider final


SettingsProvider 修改默认值数据及更新数值

SettingsProvider数据存储

frameworks\base\packages\SettingsProvider中android6.0之后用不在用settings.db这个数据了,会存储在/data/system/users/0这个目录三个xml文件下:

  1. settings_global.xml:所有的偏好设置对系统的所有用户公开,第三方有读没有写的权限
  2. settings_system.xml:包含各种各样的用户偏好系统设置
  3. settings_secure.xml:安全性的用户偏好系统设置,第三方APP有读没有写的权限
    在SettingsProvider\src\com\android\providers\settings\SettingsProvider.java中创建
 final class SettingsRegistry {
        private static final String DROPBOX_TAG_USERLOG = "restricted_profile_ssaid";

        private static final String SETTINGS_FILE_GLOBAL = "settings_global.xml";
        private static final String SETTINGS_FILE_SYSTEM = "settings_system.xml";
        private static final String SETTINGS_FILE_SECURE = "settings_secure.xml";

        private final SparseArray<SettingsState> mSettingsStates = new SparseArray<>();

        private GenerationRegistry mGenerationRegistry;

private File getSettingsFile(int key) {                                   
    if (isGlobalSettingsKey(key)) {                                       
        final int userId = getUserIdFromKey(key);                         
        return new File(Environment.getUserSystemDirectory(userId),       
                SETTINGS_FILE_GLOBAL);                                    
    } else if (isSystemSettingsKey(key)) {                                
        final int userId = getUserIdFromKey(key);                         
        return new File(Environment.getUserSystemDirectory(userId),       
                SETTINGS_FILE_SYSTEM);                                    
    } else if (isSecureSettingsKey(key)) {                                
        final int userId = getUserIdFromKey(key);                         
        return new File(Environment.getUserSystemDirectory(userId),       
                SETTINGS_FILE_SECURE);                                    
    } else {                                                              
        throw new IllegalArgumentException("Invalid settings key:" + key);
    }                                                                     
}                                                                         
                                                                          ```

## 调试的时候获取或者设置相关的默认值
通过三种类型system, secure, global 可以分别获取和这种值
设置:
 - adb shell settings put system [key] [value]
 - adb shell settings put global [key] [value]
 - adb shell settings put secure default_input_method com.sohu.inputmethod.sogouoem/.SogouIME
 
获取:
 - adb shell settings get secure default_input_method
 - adb shell settings get global device_provisioned
 - adb shell settings get system [key]
 
也可以进入/data/system/users/0输入如下命令获取
 - cat settings_global.xml | grep device_provisioned
## 修改系统默认的一些设置配置值
当我们要修改一些默认值时一般修改SettingsProvider/res/values/defaults.xml可以修改通用属性
```java
<resources>
    <bool name="def_dim_screen">true</bool>自动关屏        开
    <integer name="def_screen_off_timeout">30000</integer> Android睡眠时间为1分钟
    //假设默认打开wifi可以将下面自动设置为true
    <bool name="def_wifi_on">false</bool> //wifi 关
    ...

在SettingsProvider\src\com\android\providers\settings\DatabaseHelper.java中

private void loadGlobalSettings(SQLiteDatabase db) {
        SQLiteStatement stmt = null;
        try {
            stmt = db.compileStatement("INSERT OR IGNORE INTO global(name,value)"
                    + " VALUES(?,?);");

            // --- Previously in 'system'
            loadBooleanSetting(stmt, Settings.Global.AIRPLANE_MODE_ON,
                    R.bool.def_airplane_mode_on);
            loadBooleanSetting(stmt, Settings.Global.THEATER_MODE_ON,
                    R.bool.def_theater_mode_on);
            //获取wifi默认值并设置
            loadBooleanSetting(stmt, Settings.Global.WIFI_ON,
                    R.bool.def_wifi_on);

强制更新数据

由于公司是定制产品需要ota强制默认打开wifi开关

  • 设置default.xml字段:"def_wifi_on"为true
  • 更改SettingsProvider\src\com\android\providers\settings\SettingsProvider.java中的字段SETTINGS_VERSION 加1
private final class UpgradeController {
			//ota升级强制更改默认值需要该字段自增一如
        private static final int SETTINGS_VERSION = 132;
		private final int mUserId;
  • 最后一定要更新currentVersion如果有字段可以添加相应的字段
if (currentVersion == 131) {
    // Initialize new multi-press timeout to default value
//	final SettingsState systemSecureSettings = getSecureSettingsLocked(userId);
//    final String oldValue = systemSecureSettings.getSettingLocked(
//    				Settings.Secure.MULTI_PRESS_TIMEOUT).getValue();
//    if (TextUtils.equals(null, oldValue)) {
//    	systemSecureSettings.insertSettingLocked(
//        	Settings.Secure.MULTI_PRESS_TIMEOUT,
//            String.valueOf(getContext().getResources().getInteger(
//            	R.integer.def_multi_press_timeout_millis)),
//           SettingsState.SYSTEM_PACKAGE_NAME);
    }
	currentVersion = 132;
}

不执行的会获取SettingsProvider\src\com\android\providers\settings\DatabaseHelper.java中的版本号DATABASE_VERSION导致相应的bug
在这里插入图片描述
参考文献:
https://www.jianshu.com/p/3922f68b3560
https://www.jianshu.com/p/7815d573b12f

标签:xml,defaults,settings,private,key,默认值,SettingsProvider,final
来源: https://blog.csdn.net/qq_34541276/article/details/105708372

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有