Android系統屬性獲取及設置


Android系統屬性獲取及設置

一、系統屬性獲取及設置中的設置值

data/data/com.android.providers.settings/databases/settings.db

1、系統屬性獲取及設置

    android.os.SystemProperties文件,android.os.Build文件可以取得系統版本等信息,類似adb shell getprop看到的值。

2、設置中的設置值

    在android中,許多的系統屬性都在settings應用當中進行設置的,比如wifi、藍牙狀態,當前本機語言,屏幕亮度等等一些相關的系統屬性值。這些數據主要是存儲在數據庫中,對應的URI為:content://settings/system和content://settings/secure,這兩個是主要的,目前也只是涉及到這兩個數據庫表的使用。

    接下來,就了解下settings應用中是如何對系統屬性進行設置的。

    當需要獲得當前wifi狀態的值,調用已封裝的方法如下:
  Settings.Secure.getInt(getContentResolver() , Settings.Secure.WIFI_ON);
  修改wifi狀態只需要調用對應的setInt方法就可以實現。

  當需要獲得當前時間日期自動獲取,調用如下:
  Settings.System.getInt(getContentResolver() , "auto_time");
  修改也是調用對應的setInt方法。

      注意:這里修改settings的系統屬性值需要有相關的權限。如修改wifi狀態需要有android.permission.WRITE_SETTINGS權限,權限問題只要參考sdk下的描述就可以。
  其實在settings應用中所獲取或者修改屬性都是調用了framework中android.provider.settings的 Settings類對應的方法,也就是說真正有跟數據庫打交道的是在provider中,這里也體現了ContentProvider的用途。
  就大體說下android.provider.settings.Settings這個類吧。Settings里面創建了包含System和 Secure在內的幾個內部類,每個內部類都對應了一張數據庫表,也就是繼承自BaseColumns類,System和Secure類分別對應着 system和secure數據庫表。
  對於上面通過getInt獲得的字段,其實是在初始獲得數據庫數值的時候,首先是有getString方法將數據庫數據保留,然后在integer.parseInt將數據轉換成int類型。這就是settings讀取和保留數據的基本原理。

3、常見的系統設置 ——android.provider.Settings

      Android系統設置— android.provider.Settings

    Intent intent = new Intent(android.provider.Settings.ACTION_SETTINGS);
    startActivity(intent); // 打開系統設置界面

    Intent mIntent = new Intent(android.provider.Settings.ACTION_BLUETOOTH_SETTINGS);
    startActivity(mIntent);  // 打開藍牙設置界面 (實際上也在wifi設置中)

二、Settings.Global屬性跨應用定義標志位

        需要在不同應用中定義一個標志位,這里介紹下系統級別的應用和非系統級別應用如何添加。

1、系統級別應用

      在需要定義的地方使用 SystemProperties.set(“dev.xxx.xxx”, “false”);
      在獲取的部分使用 SystemProperties.getBoolean(“ro.mmitest”, false))
      最后記得要導包 import android.os.SystemProperties

2、非系統級別應用

      在需要定義的地方使用 Settings.Global.putInt(context.getContentResolver(),“xxx.xxx”,1);
      在獲取的部分使用boolean mTag = Settings.Global.getInt(getActivity().getContentResolver(),“xxx.xxx”, 0) == 1;
      依舊別忘記導包 import android.provider.Settings;

3、SystemProperties不能直接使用需要通過反射機制:

public final class ReflectUtil {

    public static String getProperty(String key, String defaultValue) {
        String value = defaultValue;
        try {
            Class<?> c = Class.forName("android.os.SystemProperties");
            Method get = c.getMethod("get", String.class, String.class);
            value = (String)(get.invoke(c, key, defaultValue));
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            return value;
        }
    }

    public static void setProperty(String key, String value) {
        try {
            Class<?> c = Class.forName("android.os.SystemProperties");
            Method set = c.getMethod("set", String.class, String.class);
            set.invoke(c, key, value);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}
  //獲取屬性,判斷設備是否可以實現wifi adb功能
  String property = ReflectUtil.getProperty("persist.adb.tcp.port", "0");
  Log.i(TAG, "property : " + property);

  //設置設備可以使用WiFi adb功能
  ReflectUtil.setProperty("persist.adb.tcp.port", "5555");

  //關閉設備WiFi adb功能
  ReflectUtil.setProperty("persist.adb.tcp.port", "0");

參考博客:
【1】Android系統屬性獲取及設置
【2】Android 利用Settings.Global屬性跨應用定義標志位


免責聲明!

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



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