Android Settings.System的使用

本文详细介绍了在Android系统中如何通过Settings.System接口对关键系统属性如数据连接、WiFi、飞行模式、蓝牙等进行设置与管理的过程。通过定义属性、在Settings.java中声明属性名、将属性插入数据库,以及在实际应用中获取与修改属性值,实现对系统功能的灵活控制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在Android中,如果你要打开或关闭数据连接,WiFi,飞行模式,蓝牙,你需要对数据库中这些开关的值进行修改,这时,你会使用到Settings.System,在settings数据库中这些属性值以键值对的形式存储,通过其get和put方法可进行这些系统属性的修改。


我们从如何添加一个属性开始,慢慢了解其使用方法。本例添加一个控制数据连接的属性:def_data_connection 。


1、定义属于该属性的字段,可定义为integer,string,boolean等,这里设置为boolean型,并赋值为true。

\frameworks\base\packages\SettingsProvider\res\values\defaults.xml

<bool name="def_data_connection">true</bool>

2、在settings中定义该属性名称:

\frameworks\base\core\java\android\provider\Settings.java

public static final String DATA_CONNECTION = "data_connection";

在这个Settings.java里面同时写了获取Settings.System属性值的方法,

如putInt():

public static boolean putInt(ContentResolver cr, String name, int value) {
            return putIntForUser(cr, name, value, UserHandle.myUserId());
        }

        /** @hide */
        public static boolean putIntForUser(ContentResolver cr, String name, int value,
                int userHandle) {
            if (LOCATION_MODE.equals(name)) {
                // HACK ALERT: temporary hack to work around b/10491283.
                // TODO: once b/10491283 fixed, remove this hack
                return setLocationModeForUser(cr, value, userHandle);
            }
            return putStringForUser(cr, name, Integer.toString(value), userHandle);
        }


getInt():

public static int getInt(ContentResolver cr, String name)
                throws SettingNotFoundException {
            return getIntForUser(cr, name, UserHandle.myUserId());
        }

        /** @hide */
        public static int getIntForUser(ContentResolver cr, String name, int userHandle)
                throws SettingNotFoundException {
            if (LOCATION_MODE.equals(name)) {
                // HACK ALERT: temporary hack to work around b/10491283.
                // TODO: once b/10491283 fixed, remove this hack
                return getLocationModeForUser(cr, userHandle);
            }
            String v = getStringForUser(cr, name, userHandle);
            try {
                return Integer.parseInt(v);
            } catch (NumberFormatException e) {
                throw new SettingNotFoundException(name);
            }
        }


当然还有getString,putString,getLong,putLong等等,不在一一列出。


3、把该值插入到数据库中:

\frameworks\base\packages\SettingsProvider\src\com\android\providers\settings\DatabaseHelper.java

在loadSystemSettings方法中插入到数据库并赋予处置。

private void loadSystemSettings(SQLiteDatabase db) {
        SQLiteStatement stmt = null;
        try {
            stmt = db.compileStatement("INSERT OR IGNORE INTO system(name,value)"
                    + " VALUES(?,?);");
            ........
            loadBooleanSetting(stmt, Settings.System.DATA_CONNECTION,R.bool.def_data_connection);//data connection 
            .........
         } finally {
            if (stmt != null) stmt.close();
        }
}    

其中loadBooleanSetting是赋值的方法:

    private void loadBooleanSetting(SQLiteStatement stmt, String key, int resid) {
        loadSetting(stmt, key,
                mContext.getResources().getBoolean(resid) ? "1" : "0");
    }
    private void loadSetting(SQLiteStatement stmt, String key, Object value) {
        stmt.bindString(1, key);
        stmt.bindString(2, value.toString());
        stmt.execute();
    }
此时第1步定义的def_data_connection被赋给了Settings.System.DATA_CONNECTION。

4、使用Settings.System.DATA_CONNECTION

此时我们工作已经基本结束了,接下来可以调用该属性进行操作了。

取值:

boolean enable = Settings.System.getInt(getContentResolver(),Settings.System.DATA_CONNECTION, 1)==1;

赋值:

Settings.System.putInt(context.getContentResolver(),Settings.System.DATA_CONNECTION, 0);


<think>我们正在处理一个关于Android系统设置默认值的问题。用户想知道在刷机时如何设置Settings.System的默认值。根据提供的引用,我们可以总结出以下方法: 1. **修改系统属性文件(default.xml)**:在Android系统中,可以通过在`default.xml`文件中添加字段的默认值来设置系统设置的初始值。编译系统后刷机,新增的设置字段就会生效(引用[1])。 2. **通过代码在系统启动时设置默认值**:在特定的系统广播接收器(如`RestoreRotationReceiver`)中,可以在系统启动时(或其他时机)通过代码设置默认值。例如,在`onReceive`方法中使用`Settings.Global.putInt`来设置全局设置的默认值(引用[2])。 3. **了解系统设置的存储位置**:系统设置(包括Settings.System)的存储位置,例如WiFi和蓝牙的配置信息存储在特定的XML文件中(引用[3])。但请注意,这些文件通常是在系统运行时生成的,而不是在刷机时直接设置。 对于刷机时设置Settings.System的默认值,最常用的方法是修改`default.xml`文件(通常位于`/packages/apps/Settings/res/values/`目录下)。因为Settings.System的设置属于系统设置,所以可以在该文件中添加`<integer>`, `<string>`, `<bool>`等类型的设置项。 **具体步骤**: 1. 找到`default.xml`文件(路径可能因Android版本而异,常见路径为`packages/apps/Settings/res/values/defaults.xml`或类似路径)。 2. 在文件中添加你需要的设置项。例如,要设置一个名为`screen_brightness`的整型默认值为100,可以添加: ```xml <integer name="screen_brightness">100</integer> ``` 3. 重新编译系统并刷机。 另外,如果设置项是系统属性(System Properties),也可以通过`init`进程或`system_properties`文件来设置,但Settings.System通常不直接使用系统属性,而是通过ContentProvider存储在数据库中。 **注意**:在Android高版本中,有些设置可能被迁移到Settings.Global或Settings.Secure中,需要根据设置的类型选择正确的范围。Settings.System用于用户可修改的系统设置,如亮度、音量等。 **示例代码**(在`default.xml`中添加设置): ```xml <resources> ... 其他默认设置 ... <!-- 屏幕亮度默认值 --> <integer name="screen_brightness">100</integer> <!-- 是否开启自动旋转 --> <bool name="accelerometer_rotation">true</bool> </resources> ``` **另一种方法**:在系统启动时通过代码设置。例如,在系统启动完成的广播接收器中设置: ```java public class BootReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // 设置Settings.System的默认值 Settings.System.putInt(context.getContentResolver(), Settings.System.SCREEN_BRIGHTNESS, 100); } } ``` 但这种方法需要在每次启动时都执行,且可能会被用户后续修改。 **总结**:刷机时设置默认值推荐使用修改`default.xml`文件的方法,因为这是系统初始化的默认值,不会在每次启动时覆盖用户设置(除非恢复出厂设置)。 §§相关问题§§ 1. 如何为Android系统添加一个新的设置项? 2.Android高版本中,修改系统默认设置的方法有什么变化? 3. Settings.System, Settings.Global和Settings.Secure有什么区别?</think>### 如何在刷机时设置 Android Settings.System 默认值 在 Android 系统开发中,设置 Settings.System 的默认值主要通过以下两种方法实现: #### 方法 1:修改 default.xml 配置文件(推荐) 这是最标准的设置默认值方式,修改后需重新编译系统: 1. 定位配置文件: `packages/apps/Settings/res/values/defaults.xml` 2. 添加默认值条目: ```xml <integer name="screen_brightness">80</integer> <!-- 屏幕亮度默认值 --> <bool name="haptic_feedback_enabled">true</bool> <!-- 触感反馈开关 --> ``` 3. 编译刷机: 修改后重新编译系统镜像并刷机,新设置项会自动生效[^1]。 > **原理**:系统首次启动时,`SettingsProvider` 会读取这些默认值写入系统数据库 `/data/system/users/0/settings_system.xml`[^3]。 #### 方法 2:在系统服务中动态设置 通过广播接收器在系统启动时注入默认值: ```java // 在系统服务(如 SystemUI)中添加 public class BootReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // 设置屏幕旋转默认值 Settings.System.putInt( context.getContentResolver(), Settings.System.ACCELEROMETER_ROTATION, 1 // 1=启用, 0=禁用 ); // 设置USB调试默认开启 Settings.Global.putInt( context.getContentResolver(), Settings.Global.ADB_ENABLED, 1 )[^2]; } } ``` > **注意**:需在 `AndroidManifest.xml` 注册 `BOOT_COMPLETED` 广播权限。 --- ### 关键注意事项 1. **作用域区分**: - `Settings.System`:用户级系统设置(亮度、铃声等) - `Settings.Global`:设备级全局设置(调试模式等) - `Settings.Secure`:安全敏感设置(位置服务等) 2. **存储位置**: ```bash /data/system/users/0/settings_system.xml # System设置 /data/misc/apexdata/com.android.settings/ # 高版本全局设置[^3] ``` 3. **版本兼容**: - Android 5.0+ 需检查 SELinux 策略 - Android 10+ 推荐使用 `DeviceConfig` API - 动态设置方法在高版本可能受限[^1] ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值