Android系统SettingsPrivider分析与修改方法

继上次分析Settings的文章Android 系统Settings概要之后,现要增加一些系统中没有的设置项,因上次只是猜测DatabaseHelper.java 在创建数据库时将defaults.xml中的配制存入了数据库中,因此现在来分析下SettingsPrivider源码(源码还是官方android-4.4_r1版本).

第一,主要分析DatabaseHelper.java文件:

1. 数据库文件为 settings.db  定义的表有人个 ,里面system , secure ,global 是比主要的三个。

    private static final String TAG = "SettingsProvider";
    private static final String DATABASE_NAME = "settings.db";

    // Please, please please. If you update the database version, check to make sure the
    // database gets upgraded properly. At a minimum, please confirm that 'upgradeVersion'
    // is properly propagated through your change.  Not doing so will result in a loss of user
    // settings.
    private static final int DATABASE_VERSION = 98;

    private Context mContext;
    private int mUserHandle;

    private static final HashSet<String> mValidTables = new HashSet<String>();

    private static final String TABLE_SYSTEM = "system";
    private static final String TABLE_SECURE = "secure";
    private static final String TABLE_GLOBAL = "global";

    static {
        mValidTables.add(TABLE_SYSTEM);
        mValidTables.add(TABLE_SECURE);
        mValidTables.add(TABLE_GLOBAL);
        mValidTables.add("bluetooth_devices");
        mValidTables.add("bookmarks");

        // These are old.
        mValidTables.add("favorites");
        mValidTables.add("gservices");
        mValidTables.add("old_favorites");
    }

2. 看onCreate()方法,创建表和各表的索引,然后调用了loadBookmarks(db); loadVolumeLevels(db);  loadSettings(db); 三个方法,loadBookmarks(db);是存系统几个常用的应用的intent ( 如,通讯录app,emailApp, 短信app,),loadVolumeLevels(db); 初始化的是与声音相关的配制,  loadSettings(db);方法就是从defaults.xml文件中读取默认值存入相应的表中,验证了之前
的猜测。

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("CREATE TABLE system (" +
                    "_id INTEGER PRIMARY KEY AUTOINCREMENT," +
                    "name TEXT UNIQUE ON CONFLICT REPLACE," +
                    "value TEXT" +
                    ");");
        db.execSQL("CREATE INDEX systemIndex1 ON system (name);");

        createSecureTable(db);

        // Only create the global table for the singleton 'owner' user
        if (mUserHandle == UserHandle.USER_OWNER) {
            createGlobalTable(db);
        }

        db.execSQL("CREATE TABLE bluetooth_devices (" +
                    "_id INTEGER PRIMARY KEY," +
                    "name TEXT," +
                    "addr TEXT," +
                    "channel INTEGER," +
                    "type INTEGER" +
                    ");");

        db.execSQL("CREATE TABLE bookmarks (" +
                    "_id INTEGER PRIMARY KEY," +
                    "title TEXT," +
                    "folder TEXT," +
                    "intent TEXT," +
                    "shortcut INTEGER," +
                    "ordering INTEGER" +
                    ");");

        db.execSQL("CREATE INDEX bookmarksIndex1 ON bookmarks (folder);");
        db.execSQL("CREATE INDEX bookmarksIndex2 ON bookmarks (shortcut);");

        // Populate bookmarks table with initial bookmarks
        boolean onlyCore = false;
        try {
            onlyCore = IPackageManager.Stub.asInterface(ServiceManager.getService(
                    "package")).isOnlyCoreApps();
        } catch (RemoteException e) {
        }
        if (!onlyCore) {
            loadBookmarks(db);
        }

        // Load initial volume levels into DB
        loadVolumeLevels(db);

        // Load inital settings values
        loadSettings(db);
    }

3  .    loadSettings(db); 里面的三个方法者是从defaults.xml文件中读取默认值存入相应的表中,loadSystemSettings(db)是存入System表中,loadSecureSettings(db)是存入 secure表中。

private void loadSettings(SQLiteDatabase db) {
        loadSystemSettings(db);
        loadSecureSettings(db);
        // The global table only exists for the 'owner' user
        if (mUserHandle == UserHandle.USER_OWNER) {
            loadGlobalSettings(db);
        }
    }

loadSetting()方法中SQLiteStatement将值存入了数据库中:

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

            loadBooleanSetting(stmt, Settings.System.DIM_SCREEN,
                    R.bool.def_dim_screen);
            //..............省略..................

            loadIntegerSetting(stmt, Settings.System.POINTER_SPEED,
                    R.integer.def_pointer_speed);
        } finally {
            if (stmt != null) stmt.close();
        }
    }

第二,那如何来增加设置项(例如要在设置中增加一项 账户信息):

1. 在Settings 中增加界面相关的代码:

1.a.    Settings/res/xml/settings_headers.xml文件中增加:

<header

android:id="@+id/account_info"

android:fragment="com.android.settings.accounts.AccountInfoSettings"

android:title="@string/account_info_label"

android:icon="@drawable/ic_menu_add_dark"/>

1.b.   增加字符串图标等 ,如  Settings/res/values/strings.xml文件中:

<string name="account_info_label" >"账号信息"</string>

1.c  相关类与代码的编写:如 创建Fragment:AccountInfoSettings 并写代码,里面的代码会Settings.System.put**的代码将操作SettingsProvider

2. 修改SettingsPrivider

2. a   defalult.xml

<bool name="def_acctount_islogin">false</bool>

<string name="def_acctount_name">请设置昵称</string>

2. b  DatabaseHelper.java 在loadSecureSettings(SQLiteDatabase db) 方法中增加

loadBooleanSetting(stmt, Settings.Secure.ACCOUNT_ISLOGIN,

R.bool.def_account_islogin);

loadStringSetting(stmt, Settings.Secure.ACCOUNT_NAME,

R.string.def_account_name);

3. 在/android-4.4_r1/frameworks/base/core/java/android/provider/Settings.java 文件中找到内部静态类:public static final class Secure extends NameValueTable {..........} 在Secure类中增加:

public static final String ACCOUNT_ISLOGIN = "def_account_islogin";

public static final String ACCOUNT_NAME = "def_account_name";

到此修改基本完成,可以编译,运行,测试了。实际开发中的步骤应该是3.2,1按倒着的顺序来做^-^.

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-10 10:11:02

Android系统SettingsPrivider分析与修改方法的相关文章

[Android Pro] Android系统手机端抓包方法

抓包准备 1. 手机要有root权限 2. 下载tcpdump   http://www.strazzere.com/android/tcpdump 3. adb push c:\wherever_you_put\tcpdump /data/local/tcpdump 4. adb shell chmod 6755 /data/local/tcpdump 5, adb shell,   su获得root权限 6, cd /data/local 7, ./tcpdump -i any -p -s

利用命令行删除Android系统自带应用的方法

一般来说,手机厂家都会在手机中内置许多应用,而这些应用是使用一般的应用程序管理无法删除的.当然,现在有一些APP,如360和豌豆荚,在获取了系统的root权限之后是可以删除自带应用的.但是如果我不想让一个app来获取我的root权限呢?有没有方便.快捷的方法呢? 当然有,那就是利用shell命令.当然,首先要安装当前手机的驱动程序,否则无法进行调试. 在如何删除Android系统中的内置应用一文中作者也介绍了利用命令行删除系统应用的方法,但是个人感觉太麻烦了,其实有更简单的方法,只要三步即可:a

替换Android系统镜像system.img的方法

以前那个是8皇后问题,用的递归写法,然后这个可以求n皇后放置问题,用的纯粹数学方法--神奇! #include <iostream> #include <cstdio> #include <fstream> #include <algorithm> #include <cmath> #include <deque> #include <vector> #include <list> #include <q

Android 系统默认参数的修改

转自: http://www.th7.cn/Program/Android/201505/447097.shtml 写在前面的话 一般在新项目开始之初,我们需要针对客户需求进行各种系统默认属性的配置,通常这些属性都是通过build.prop.settings.db .default.xml.一些功能package下的 config.xml 等来进行初始化配置的. 那么,要满足客户的定制需求,对于我们开发者来说,修改SettingsProvider默认值,而第一次开机时,用来填充settings.

Android 系统开机logo的修改【转】

本文转载自:http://blog.csdn.net/yandongqiangZHRJ/article/details/8585273 看到了好几个修改logo的博文,但是说的不是很清楚,在这里亲手送上通过自己的动手修改过验证后的方法. Android 开机其实总共会出现3个画面: 1.第一个就是 Linux 系统启动,出现linux小企鹅画面(reboot): 2.当android系统从Linux内核启动后,将会执行anddroid平台的初始化过程,屏幕上将会出现”A N D R I O D”

Android Bluetooth 文件接收路径修改方法

修改文件: packages/apps/Bluetooth/src/com/android/bluetooth/opp/BluetoothOppReceiveFileInfo.java 相关代码片段: public static BluetoothOppReceiveFileInfo generateFileInfo(Context context, int id) { ContentResolver contentResolver = context.getContentResolver();

Android系统手机端抓包方法

抓包准备 1. Android手机需要先获得root权限.一种是否获得root权限的检验方法:安装并打开终端模拟器(可通过安卓市场等渠道获得).在终端模拟器界面输入su并回车,若报错则说明未root,若命令提示符从$变#则为rooted: 2. 如果Android手机尚未root,可通过superoneclick或其它方法进行root处理(需要先安装Microsoft .NET Framework).Superoneclick刷root权限教程:(http://soft.shouji.com.c

Android系统手机端抓包方法(tcpdump)

抓包准备 1. Android手机需要先获得root权限.一种是否获得root权限的检验方法:安装并打开终端模拟器(可通过安卓市场等渠道获得).在终端模拟器界面输入su并回车,若报错则说明未root,若命令提示符从$变#则为rooted: 2. 如果Android手机尚未root,可通过superoneclick或其它方法进行root处理(需要先安装Microsoft .NET Framework).Superoneclick刷root权限教程:(http://soft.shouji.com.c

Android系统默认输入法的修改为搜狗输入法

1.  frameworks\base\packages\SettingsProvider\res\values\defaults.xml 文件中修改默认输入法为搜狗输入法 <stringname="config_default_input_method" translatable="false">com.sohu.inputmethod.sogou/.SogouIME         </string> <stringname=&qu