zoukankan      html  css  js  c++  java
  • 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属性跨应用定义标志位

  • 相关阅读:
    Session cookie 原理
    asp.net core service mesh
    js 常用库
    asp.net core consul
    asp.net core polly
    asp.net core ocelot
    第十五章 享元模式 Flyweight
    第十四章 策略模式 Strategy
    mysql 主从复制
    mysql 执行计划
  • 原文地址:https://www.cnblogs.com/shujk/p/14851329.html
Copyright © 2011-2022 走看看