android setting之Settings.system设置

Posted 知不足而奋进

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android setting之Settings.system设置相关的知识,希望对你有一定的参考价值。

在开发调试android 系统的Setting时,总是会见到以下的代码:

Settings.System.getInt(contentResolver, Settings.System.SOUND_EFFECTS_ENABLED, 1)
Settings.System.putInt(getActivity().getContentResolver(),
                Settings.System.SOUND_EFFECTS_ENABLED, enabled ? 1 : 0);
Settings.Global.putInt

其实这些值都是setting 里面设置的默认值。例如 wifi ,蓝牙,声音开关等。有时候我们想要去在系统出厂时将一些默认值修改。则可以更改以下的配置文件。其实以上的getInt等都是load的下面配置文件中的值。
frameworks\\base\\packages\\SettingsProvider\\res\\values
......

在真机中,通过setting设置的值都是存在在以下目录下的

/data/data/com.android.providers.settings/databases/settings.db里,里面有三个表global, system, secure.

可以通常这样查看数据:

adb shell sqlite3 data/data/com.android.providers.settings/databases/settings.db "select * from secure"

但是自从android 6.0以后这几个表都变为了xml文件。具体位置如下:

不同用户放不同的路径下,如果没有创建新用户,则在/data/system/users/0下

settings_global.xml, settings_system.xml, settings_secure.xml

另外,如果需要在串口或者adb 调试的话,可以直接使用命令是改变这些值:

   settings get global 系统属性key

   settings put global 系统属性key 系统属性值

这里put相当于 Settings.System.putInt 的命令效果

在代码中可以直接读取使用:

Settings.System.getInt(contentResolver, "xxxxxxxxxxx", 0)

如果有留意Android中系统设置Settings里面的源码,你会发现代码中频繁用到了Settings.System操作,该类通过键值对的形式,将一些特定的值以全局的模式保存到Setting的数据库中,我们可以通过它提供的get或者put形式的方法对其中的数据进行读写操作,(非系统级别的应用需要添加对应的权限)。当然,如果能够对frameworks进行修改,我们甚至可以在该类中添加一些特定的值,以方便自己或他人使用。
一、通过Settings.System进行读写
//其中"getXXX"代表对应的类似方法,如getInt()、getBoolean、putString()等。
//通过变量名称获取值,如果变量不存在,数据库中没有设置过初始值或者该值类型不对,将抛出SettingNotFoundException异常
Settings.System.getXXX(ContentResolver cr, String name);
//通过变量名称获取值,如果发生上面方法中导致异常的情况,将返给定的默认值
Settings.System.getXXX(ContentResolver cr, String name, XXX def);
//将指定名称的值写入数据库
Settings.System.putXXX(ContentResolver cr,String name, XXX Value);

非系统权限,需要在App项目的AndroidMainfes.xml文件中添加如下权限:

	<uses-permission android:name="android.permission.READ_SETTINGS" />
	<uses-permission android:name="android.permission.WRITE_SETTINGS" />

二、在Settings.System添加一个自定义的全局变量
Settings.java文件位于frameworks\\base\\core\\java\\android\\provider下,打开该文件,搜索关键词 SETTINGS_TO_BACKUP ,共有两处,一处是在Settings里面,另一处在内部类Settings.System里面,在SETTINGS_TO_BACKUP数组上面添加自定义变量,同时在该数组里面添加自定义变量名称,Settting和内部类System都需要添加(共四个地方),比如自定义系统变量SYSTEM_ZWH:

 	public static final String SYSTEM_ZWH = "system_zwh";
	Public static final String[] SETTINGS_TO_BACKUP = {
	...
	SYSTEM_ZWH,
	... }

然后,在代码中我们就可以通过对于的get和put方法对该值进行读取和写入操作了。

以上是关于android setting之Settings.system设置的主要内容,如果未能解决你的问题,请参考以下文章

Android4.42-Settings源码分析之蓝牙模块Bluetooth(上)

Android4.42-Settings源代码分析之蓝牙模块Bluetooth总体实现(总)

Android Studio 第五十六期 - Android之系统设置选项的包名

Android6.0 源码修改之Settings音量调节界面增加通话音量调节

[Android 11]使用Android Studio调试系统应用之Settings移植:签名部署,解决运行时错误

Android的settings命令