android Setting里的Settings.System属性讲解

本文介绍了如何在安卓9中修改Settings.apk的预设值,包括通过Settings.System进行注册、修改开机启动默认值的方法。重点讲述了如何找到并修改对应的系统设置变量,以及使用Settings.System.get和put方法进行查询和更新。文章还提醒在6.0以上版本可能需要申请权限。

本文所在的平台是安卓9

前言:

Setting.apk源码里会有很多的预设值,且关机后还是会保留之前的更改的值。很多时候我们需要改预设值,即一次开机时状态。除了system.prop的值外还有就是Settings.System.getxxxx获取的值。比如:

Settings.System.putInt(getContentResolver(), "navigationbar_config", 1);

1.Settings.System的注册

getContentResolver().registerContentObserver(Settings.System.getUriFor("navigationbar_config"), true,mNavigationSettingsObserver, UserHandle.USER_ALL);

这个形式的函数,就是用来注册 navigationbar_config 这个id。

 

2.让navigationbar_config 成为可以设置的值

public static final String NAVIGATION_BAR_CONFIG = "navigationbar_config";

路径:frameworks/base/core/java/android/provider/Settings.java

在这个文件里,会有很多字符串的赋值。

3.修改开机启动默认值

在对应的xml里修改,本变量路径:frameworks/base/packages/SettingsProvider/res/values/defaults.mxl

我们会发现,虽然我们id叫navigationbar_config,但是修改的变量里带了 bar ,这个会导致我们grep navigationbar_config的时候会找不到需要的变量。

我们在看看第2点的NAVIGATION_BAR_CONFIG,我们就知道为什么要先找这个设置的变量了,因为我们可以通过

grep -nr NAVIGATION_BAR_CONFIG  找到这个xml文件。

 

4.Settings.System get&put

get:

Settings.System.getInt(getContentResolver(), "navigationbar_config", 0);

put:

Settings.System.putInt(getContentResolver(), "navigationbar_config", 0xFF);

ps:注意看类型,这个是Int。

剩下这个两个就是大家常见的用法,在各大应用都用这个方法来查询和修改系统设置的变量。比如wifi,蓝牙,或者自己定义的。 据说在6.0以上的版本,需要申请权限,可自行查阅相关资料。

 

 

最后,希望可以帮到大家,如果有用的就收藏一下,白嫖的就点个赞。

 

Android 系统中,`Setting airplane_mode_on` 从 `android.provider.Settings.System` 迁移到 `android.provider.Settings.Global` 后返回只读值,可按以下方式解决: ### 1. 检查 API 级别 由于 `Settings.Global` 仅支持 API 17+,低版本需回退到 `Settings.System`。可通过代码检查当前设备的 API 级别,然后选择合适的设置类: ```java if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR1) { // API 17及以上版本使用 Settings.Global // 读取值 int airplaneMode = Settings.Global.getInt(context.getContentResolver(), Settings.Global.AIRPLANE_MODE_ON, 0); // 写入值 Settings.Global.putInt(context.getContentResolver(), Settings.Global.AIRPLANE_MODE_ON, 1); } else { // API 17以下版本使用 Settings.System // 读取值 int airplaneMode = Settings.System.getInt(context.getContentResolver(), Settings.System.AIRPLANE_MODE_ON, 0); // 写入值 Settings.System.putInt(context.getContentResolver(), Settings.System.AIRPLANE_MODE_ON, 1); } ``` ### 2. 权限管理 - **动态权限申请**:使用 `Settings.System` 时需遵循 Android 权限模型,避免直接硬编码权限检查。对于 `Settings.Global`,修改时必须是系统签名应用。 ```java // 动态申请权限 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M &&!Settings.System.canWrite(context)) { Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS); intent.setData(Uri.parse("package:" + context.getPackageName())); context.startActivity(intent); } ``` ### 3. 确保应用具有修改权限 - **`Settings.Global`**:修改时必须是系统签名应用。若应用不是系统签名应用,可尝试在 `AndroidManifest.xml` 中声明 `android:sharedUserId="android.uid.system"`,但这需要系统签名。 ```xml <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.app" android:sharedUserId="android.uid.system"> <!-- 其他配置 --> </manifest> ``` - **`Settings.System`**:需动态申请 `WRITE_SETTINGS` 权限。 ### 4. 数据持久化 `Settings` 组件的数据会实时写入数据库,无需额外处理。若使用 `SystemProperties` 且需持久化,属性名必须以 `persist.` 开头,否则重启后数据会丢失。 ### 5. 避免滥用反射 非系统应用通过反射操作 `SystemProperties` 可能导致兼容性问题,如 Android 版本差异,应避免使用反射操作 `SystemProperties` 来处理飞行模式设置。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值