Android系统中增加Settings中的自定义Key值

Settings Provider系统设置数据表中保存系统中偏好设置,应用可通过Settings的API访问对应偏好设置,主要Settings.Global、 Settings.Secure、 Settings.System三种类型的设置。
Settings.Global:全局系统设置,包含始终以相同方式应用于所有已定义用户的偏好设置。 应用程序可以读取这些内容,但不允许写入;与“安全”设置一样,这些设置适用于用户必须通过系统 UI 或这些值的专用 API 显式修改的首选项。常用设置项有蓝牙开关状态、adb开关状态等。
Settings.Secure:安全系统设置,包含应用程序可以读取但不允许写入的系统首选项。 这些首选项适用于用户必须通过系统 UI 或这些值的专用 API 显式修改的首选项,而不是由应用程序直接修改。常用设置项有无障碍、VPN状态等。
Settings.System:系统设置,包含混杂的系统偏好设置。 此表包含简单的名称/值对。 有一些方便的方法可用于访问各个设置条目。常用设置项有铃声、亮度、时间制式等。
下面介绍自定义一个Settings.Global的key的流程,自定义Settings.Secure、 Settings.System的方式类似。

Settings中的修改

源码路径 :

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

Settings的内部类Global中增加自定义Key的常量值,可以是String、int、boolean等常用类型。

 public static final class Global extends NameValueTable {
        /**
         * @hide
         */
        public static final String CUSTOM_KEY = "your_custom_key";
 }

MOVED_TO_GLOBAL列表中添加对应自定义Key:

        @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
        private static final HashSet<String> MOVED_TO_GLOBAL;
        @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
        private static final HashSet<String> MOVED_TO_SECURE_THEN_GLOBAL;
        static {
            MOVED_TO_GLOBAL = new HashSet<>();
            MOVED_TO_SECURE_THEN_GLOBAL = new HashSet<>();

            // these were originally in system but migrated to secure in the past,
            // so are duplicated in the Secure.* namespace
            MOVED_TO_SECURE_THEN_GLOBAL.add(Global.ADB_ENABLED);
            MOVED_TO_SECURE_THEN_GLOBAL.add(Global.BLUETOOTH_ON);
            ...省略
            MOVED_TO_GLOBAL.add(Settings.Global.RADIO_NFC);
            MOVED_TO_GLOBAL.add(Settings.Global.RADIO_CELL);
            MOVED_TO_GLOBAL.add(Settings.Global.RADIO_WIFI);
            MOVED_TO_GLOBAL.add(Settings.Global.RADIO_BLUETOOTH);
            MOVED_TO_GLOBAL.add(Settings.Global.RADIO_WIMAX);
            MOVED_TO_GLOBAL.add(Settings.Global.SHOW_PROCESSES);
            
            /** 添加你的自定义Keys */
            MOVED_TO_GLOBAL.add(Settings.Global.CUSTOM_KEY);

        }

再将自定义Key添加到PUBLIC_SETTINGS的公共系统key列表中:


        /**
         * @hide
         */
        public static final String CUSTOM_KEY = Global.CUSTOM_KEY;

        /**
         * These are all public system settings
         *
         * @hide
         */
        @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
        public static final Set<String> PUBLIC_SETTINGS = new ArraySet<>();
        static {
            PUBLIC_SETTINGS.add(END_BUTTON_BEHAVIOR);
            PUBLIC_SETTINGS.add(WIFI_USE_STATIC_IP);
            PUBLIC_SETTINGS.add(WIFI_STATIC_IP);
            PUBLIC_SETTINGS.add(WIFI_STATIC_GATEWAY);
            PUBLIC_SETTINGS.add(WIFI_STATIC_NETMASK);
            ...省略
            PUBLIC_SETTINGS.add(HAPTIC_FEEDBACK_ENABLED);
            PUBLIC_SETTINGS.add(SHOW_WEB_SUGGESTIONS);
            PUBLIC_SETTINGS.add(VIBRATE_WHEN_RINGING);
            PUBLIC_SETTINGS.add(APPLY_RAMPING_RINGER);
            
            /** 添加你的自定义Keys*/
            PUBLIC_SETTINGS.add(CUSTOM_KEY);
        }

SettingsProvider中的修改

1.在SettingsProvider的系统应用模块中添加默认值
源码路径:

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

代码如下:

<resources>
    <bool name="def_dim_screen">true</bool>
    <integer name="def_screen_off_timeout">60000</integer>
    <integer name="def_sleep_timeout">-1</integer>
    <bool name="def_airplane_mode_on">false</bool>
    <bool name="def_theater_mode_on">false</bool>
    <!-- Comma-separated list of bluetooth, wifi, and cell. -->
    <string name="def_airplane_mode_radios" translatable="false">cell,bluetooth,wifi,nfc,wimax</string>
    <string name="airplane_mode_toggleable_radios" translatable="false">bluetooth,wifi,nfc</string>
    <string name="def_bluetooth_disabled_profiles" translatable="false">0</string>
    <bool name="def_auto_time">true</bool>
    <bool name="def_auto_time_zone">true</bool>
    <bool name="def_accelerometer_rotation">false</bool>
    <!-- Default screen brightness, from 0 to 255.  102 is 40%. -->
    <integer name="def_screen_brightness">102</integer>
    <bool name="def_screen_brightness_automatic_mode">false</bool>
    <fraction name="def_window_animation_scale">100%</fraction>
    <fraction name="def_window_transition_scale">100%</fraction>
    <bool name="def_haptic_feedback">true</bool>
    ...省略

    <!-- 添加你的自定义Keys -->
    <string name="def_custom_key">key1</bool>

2.通过loadGlobalSettings加载自定义的Keys到SettingsProvider系统应用模块的数据库中。
源码路径:

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

代码如下:

    private void loadGlobalSettings(SQLiteDatabase db) {
        SQLiteStatement stmt = null;
        final Resources res = mContext.getResources();
        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);
   
            ...省略
            loadSetting(stmt, Settings.Global.LID_BEHAVIOR, defaultLidBehavior);
            
            //添加你的自定义Keys
            loadStringSetting(stmt, Settings.Global.CUSTOM_KEY, R.string.def_custom_key);
        } finally {
            if (stmt != null) stmt.close();
        }
    }

    private void loadStringSetting(SQLiteStatement stmt, String key, int resid) {
        loadSetting(stmt, key, mContext.getResources().getString(resid));
    }

结语

完成以上修改后,即可在任一系统应用中使用自定义的Key:

     String value = Settings.Global.getString(getContentResolver(), Settings.Global.CUSTOM_KEY);

     Settings.Global.putString(getContentResolver(), Settings.Global.CUSTOM_KEY, " ");

更多请参考另一篇博客中对于SettingsProvider的相关介绍:浅谈android系统应用中的数据共享

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

言并肃

感谢大哥支持!您的鼓励是我动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值