android studio应用获取系统属性权限(SystemProperties),针对AS 3.4 以上版本获取SystemProperties

AS项目中,当出现错误: 找不到符号 符号: 类android.os.SystemProperties,一般解决办法就是导入layoutlib.jar,得到android.os.SystemProperties类即可,下面我们详细介绍一下!

        Android的系统属性相当于Windows的注册表,由key和value组成,且都是核心系统的一个基本机制。相对于Windows的注册表,Android的系统属性要简单一些,它没有Windows注册表的树状结构,而只是一个列表,也就是说没有父子关系。value有string,int,long,boolean,但是设置只能通过字符串方式。读取系统属性,是通过SystemProperties类来实现的。SystemProperties在android.os下,但这个类是隐藏的,上层程序开发无法直接使用。要使用这个类,有两种方法。一个是导入layoutlib.jar,另外一种是通过反射的方式调用。

一、导入layoutlib.jar

1.首先我们到sdk确认layoutlib.jar的存在,比如我项目目录下


2.然后在 /app/build.gradle 添加下面这段代码到末尾(注意一定要在 android 、dependencies之后)

String SDK_DIR = System.getenv("ANDROID_SDK_HOME")
if (SDK_DIR == null) {
    Properties props = new Properties()
    props.load(new FileInputStream(project.rootProject.file("local.properties")))
    SDK_DIR = props.get('sdk.dir');
}
dependencies {
    compileOnly files("${SDK_DIR}/platforms/android-24/data/layoutlib.jar")
}

该步骤是通过在gradle中添加函数,动态获取layoutlib.jar路径,需要注意的是

compileOnly files("${SDK_DIR}/platforms/android-24/data/layoutlib.jar")

引入依赖的时候要用 compileOnly 而非旧版本AS的 provided即可,并且这个路径中,需要确定android-24/data/layoutlib.jar 中有android/os/systemProperites.class 。如果没有,可以在其他版本中查找,如adnroid-23,有的话把这个替换成android-23.。

3.导入之后,直接

import android.os.SystemProperties;

就可以正常使用了。注意:引入的layoutlib.jar并不会编译到APK包里面,因此不需要担心增加最终的APK的大小的情况。

二、反射调用

对于不想引入layoutlib.jar的情况,可以直接使用下面的反射类(PropertyUtils.class)来实现调用。

import java.lang.reflect.Method;

public class PropertyUtils {

    private static volatile Method set = null;
    private static volatile Method get = null;

    public static void set(String prop, String value) {

        try {
            if (null == set) {
                synchronized (PropertyUtils.class) {
                    if (null == set) {
                        Class<?> cls = Class.forName("android.os.SystemProperties");
                        set = cls.getDeclaredMethod("set", new Class<?>[]{String.class, String.class});
                    }
                }
            }
            set.invoke(null, new Object[]{prop, value});
        } catch (Throwable e) {
            e.printStackTrace();
        }
    }


    public static String get(String prop, String defaultvalue) {
        String value = defaultvalue;
        try {
            if (null == get) {
                synchronized (PropertyUtils.class) {
                    if (null == get) {
                        Class<?> cls = Class.forName("android.os.SystemProperties");
                        get = cls.getDeclaredMethod("get", new Class<?>[]{String.class, String.class});
                    }
                }
            }
            value = (String) (get.invoke(null, new Object[]{prop, defaultvalue}));
        } catch (Throwable e) {
            e.printStackTrace();
        }
        return value;
    }
}

导入之后,直接调用即可,比如 PropertyUtils.get("persist.sys.productivity_mode","0"));

 

猜你喜欢

转载自blog.csdn.net/Wang_WY/article/details/109722836