MTK Android Android數據保存到系統數據庫


如果有留意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添加一個自定義的全局變量

frameworks\base\core\java\android\provider\Settings.Java下,打開該文件,搜索關鍵詞 SETTINGS_TO_BACKUP ,共有兩處,

一處是在Settings里面,另一處在內部類Settings.System里面,在SETTINGS_TO_BACKUP數組上面添加自 定義變量,同時在該數組里面添加自定義變量名稱,

Settting和內部類System都需要添加(共四個地方),比如自定義系統變量 SYSTEM_ZWH:

 

 

三、如何使用全局變量

a:定義變量

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

   /**
    * mobile model             
    * @hide
    */
    public static final String MOBILE_MODEL="mobile_model";

 

        /**
         * Settings to backup. This is here so that it's in the same place as the settings
         * keys and easy to update.
         *
         * NOTE: Settings are backed up and restored in the order they appear
         *       in this array. If you have one setting depending on another,
         *       make sure that they are ordered appropriately.
         *
         * @hide
         */
        public static final String[] SETTINGS_TO_BACKUP = {

     MOBILE_MODEL,  //mobile model 
 
b:初始化變量
frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
loadSetting(stmt, Settings.System.MOBILE_MODEL, VERSION.RELEASE); 
VERSION.RELEASE:
frameworks/base/core/java/android/os/Build.java
    /** Various version strings. */
    public static class VERSION {
 
    /**
     * The user-visible version string.  E.g., "1.0" or "3.4b5".
     */
     public static final String RELEASE = getString("ro.build.version.release");
 
c:使用全局變量賦值
packages/apps/Settings/src/com/android/settings/DeviceInfoSettings.java
Settings.System.putString(this.getContentResolver(), Settings.System.MOBILE_MODEL, "4.4");
 
d:使用全局變量獲取值
packages/apps/Select/src/com/mtk/select/selectActivity.java
EditText sysEdit = (EditText) findViewById(R.id.system_name_edit);
sysEdit.setText(Settings.System.getString(this.getContentResolver(),
        Settings.System.MOBILE_MODEL));//mobile model
 
 
 
 
 

Android保存數據到系統數據庫中:Settings.System


有時候我們一些設置屬性要保存到本地,防止軟件卸載后配置屬性消失。 

比如我今天就有個修改手機藍牙名稱顯示的功能,但是只需要修改一次,並且進行標記,並保存這個標識,如果程序卸載,重新安裝也不需要再修改,這里就是要保存這個標識,來判斷是否需要修改名稱。
要實現這個功能,SharePreference是不行的了,本地文件file保存呢,是可以的,但是比較麻煩,而且有被刪掉的可能。
這里介紹一個比較簡單、實用的方法:
這個方法就是把標識保存到系統配置(系統數據庫)文件中,即使程序卸載也不影響,系統的配置文件。
代碼示例:

import android.provider.Settings;
import android.util.Log;
import android.content.Context;

//設置系統配置文件中的數據,第一個參數固定的,但是需要上下文,第二個參數是保存的Key,第三個參數是保存的value
boolean changeBluetoothName = Settings.System.putInt(getContentResolver(), "changeBluetoothName", 1);

//獲取系統配置文件中的數據,第一個參數固定的,但是需要上下文,第二個參數是之前保存的Key,第三個參數表示如果沒有這個key的情況的默認值
int blueFlag = Settings.System.getInt(getContentResolver(), "changeBluetoothName", 0);

這里的保存數據類似SharePreference,保存的是鍵值對key-value,但是這里的數據是保存到系統文件中的,跟程序無關,但是在程序中是可以能夠獲取的。
上面示例代碼保存的是int數據,也可以使用putString保存String數據,putByte保存byte數據等等。。。
同樣的,獲取也是根據保存的數據類型來獲取。

運行前還要添加一個權限,否則會報錯
<uses-permission android:name="android.permission.WRITE_SETTINGS"/>


據說這個系統配置文件的位置是:
/data/data/com.android.providers.settings/databases/


數據庫控制的代碼:
frameworks\base\packages\SettingsProvider\src\com\android\providers\settings的DatabaseHelper類里


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM