Android应用获取系统属性

来源:互联网 发布:咫尺网络手机版 编辑:程序博客网 时间:2024/05/08 20:05
在一个Android应用中因为要获取系统的属性, 比如说型号, model等一些属性, 通过下列方法就可以获取到.

使用adb shell prop可以查看Android系统的属性.详情看下图

上面列出了很多属性, 如果要在使用中使用该属性, 比如说我是为了判断该手机是不是魅族手机.

google在framework层提供了一个SystemProperties类, 该类位于框架层, 具体位置是frameworks/base/core/java/android/os/SystemProperties.java

该类提供了很详细的访问各种属性的方法,所以我可以使用反射机制来获取我想要的参数.

package me.chasel.utilsimport java.io.File;import java.lang.reflect.Method;import android.content.Context;import dalvik.system.DexFile;public class SystemPropertiesProxy{    /**     * 根据给定Key获取值.     * @return 如果不存在该key则返回空字符串     * @throws IllegalArgumentException 如果key超过32个字符则抛出该异常     */    public static String get(Context context, String key) throws IllegalArgumentException {        String ret= "";        try{          ClassLoader cl = context.getClassLoader();           @SuppressWarnings("rawtypes")          Class SystemProperties = cl.loadClass("android.os.SystemProperties");          //参数类型          @SuppressWarnings("rawtypes")              Class[] paramTypes= new Class[1];          paramTypes[0]= String.class;          Method get = SystemProperties.getMethod("get", paramTypes);          //参数          Object[] params= new Object[1];          params[0]= new String(key);          ret= (String) get.invoke(SystemProperties, params);        }catch( IllegalArgumentException iAE ){            throw iAE;        }catch( Exception e ){            ret= "";            //TODO        }        return ret;    }    /**     * 根据Key获取值.     * @return 如果key不存在, 并且如果def不为空则返回def否则返回空字符串     * @throws IllegalArgumentException 如果key超过32个字符则抛出该异常     */    public static String get(Context context, String key, String def) throws IllegalArgumentException {        String ret= def;        try{          ClassLoader cl = context.getClassLoader();           @SuppressWarnings("rawtypes")          Class SystemProperties = cl.loadClass("android.os.SystemProperties");          //参数类型          @SuppressWarnings("rawtypes")              Class[] paramTypes= new Class[2];          paramTypes[0]= String.class;          paramTypes[1]= String.class;                    Method get = SystemProperties.getMethod("get", paramTypes);          //参数          Object[] params= new Object[2];          params[0]= new String(key);          params[1]= new String(def);          ret= (String) get.invoke(SystemProperties, params);        }catch( IllegalArgumentException iAE ){            throw iAE;        }catch( Exception e ){            ret= def;            //TODO        }        return ret;    }    /**     * 根据给定的key返回int类型值.     * @param key 要查询的key     * @param def 默认返回值     * @return 返回一个int类型的值, 如果没有发现则返回默认值     * @throws IllegalArgumentException 如果key超过32个字符则抛出该异常     */    public static Integer getInt(Context context, String key, int def) throws IllegalArgumentException {        Integer ret= def;        try{          ClassLoader cl = context.getClassLoader();           @SuppressWarnings("rawtypes")          Class SystemProperties = cl.loadClass("android.os.SystemProperties");          //参数类型          @SuppressWarnings("rawtypes")              Class[] paramTypes= new Class[2];          paramTypes[0]= String.class;          paramTypes[1]= int.class;            Method getInt = SystemProperties.getMethod("getInt", paramTypes);          //参数          Object[] params= new Object[2];          params[0]= new String(key);          params[1]= new Integer(def);          ret= (Integer) getInt.invoke(SystemProperties, params);        }catch( IllegalArgumentException iAE ){            throw iAE;        }catch( Exception e ){            ret= def;            //TODO        }        return ret;    }    /**     * 根据给定的key返回long类型值.     * @param key 要查询的key     * @param def 默认返回值     * @return 返回一个long类型的值, 如果没有发现则返回默认值     * @throws IllegalArgumentException 如果key超过32个字符则抛出该异常     */    public static Long getLong(Context context, String key, long def) throws IllegalArgumentException {        Long ret= def;        try{          ClassLoader cl = context.getClassLoader();          @SuppressWarnings("rawtypes")              Class SystemProperties= cl.loadClass("android.os.SystemProperties");          //参数类型          @SuppressWarnings("rawtypes")              Class[] paramTypes= new Class[2];          paramTypes[0]= String.class;          paramTypes[1]= long.class;            Method getLong = SystemProperties.getMethod("getLong", paramTypes);          //参数          Object[] params= new Object[2];          params[0]= new String(key);          params[1]= new Long(def);          ret= (Long) getLong.invoke(SystemProperties, params);        }catch( IllegalArgumentException iAE ){            throw iAE;        }catch( Exception e ){            ret= def;            //TODO        }        return ret;    }    /**     * 根据给定的key返回boolean类型值.     * 如果值为 'n', 'no', '0', 'false' or 'off' 返回false.     * 如果值为'y', 'yes', '1', 'true' or 'on' 返回true.     * 如果key不存在, 或者是其它的值, 则返回默认值.     * @param key 要查询的key     * @param def 默认返回值     * @return 返回一个boolean类型的值, 如果没有发现则返回默认值     * @throws IllegalArgumentException 如果key超过32个字符则抛出该异常     */    public static Boolean getBoolean(Context context, String key, boolean def) throws IllegalArgumentException {        Boolean ret= def;        try{          ClassLoader cl = context.getClassLoader();           @SuppressWarnings("rawtypes")          Class SystemProperties = cl.loadClass("android.os.SystemProperties");          //参数类型          @SuppressWarnings("rawtypes")              Class[] paramTypes= new Class[2];          paramTypes[0]= String.class;          paramTypes[1]= boolean.class;            Method getBoolean = SystemProperties.getMethod("getBoolean", paramTypes);          //参数               Object[] params= new Object[2];          params[0]= new String(key);          params[1]= new Boolean(def);          ret= (Boolean) getBoolean.invoke(SystemProperties, params);        }catch( IllegalArgumentException iAE ){            throw iAE;        }catch( Exception e ){            ret= def;            //TODO        }        return ret;    }    /**     * 根据给定的key和值设置属性, 该方法需要特定的权限才能操作.     * @throws IllegalArgumentException 如果key超过32个字符则抛出该异常     * @throws IllegalArgumentException 如果value超过92个字符则抛出该异常     */    public static void set(Context context, String key, String val) throws IllegalArgumentException {        try{          @SuppressWarnings("unused")          DexFile df = new DexFile(new File("/system/app/Settings.apk"));          @SuppressWarnings("unused")          ClassLoader cl = context.getClassLoader();           @SuppressWarnings("rawtypes")          Class SystemProperties = Class.forName("android.os.SystemProperties");          //参数类型          @SuppressWarnings("rawtypes")              Class[] paramTypes= new Class[2];          paramTypes[0]= String.class;          paramTypes[1]= String.class;            Method set = SystemProperties.getMethod("set", paramTypes);          //参数               Object[] params= new Object[2];          params[0]= new String(key);          params[1]= new String(val);          set.invoke(SystemProperties, params);        }catch( IllegalArgumentException iAE ){            throw iAE;        }catch( Exception e ){            //TODO        }    }}

这是第一种方法, 这也是一种万能的方法.

当然如果不是非常必要的话, 建议还是不要使用这样的万能方法.

第二种方法是其它如果只是要简单的判断是否为魅族手机的话, 完全可以调用google提供的api来做.

android.os.Build.BRAND

使用上面的属性如果是魅族手机的话返回返回Meizu.

这是和我使用adb shell prop看到的属性是一致的, 可以看下图

看到该类的源码也可以看到如下内容

public class Build {    /** Value used for when a build property is unknown. */    public static final String UNKNOWN = "unknown";    /** Either a changelist number, or a label like "M4-rc20". */    public static final String ID = getString("ro.build.id");    /** A build ID string meant for displaying to the user */    public static final String DISPLAY = getString("ro.build.display.id");    /** The name of the overall product. */    public static final String PRODUCT = getString("ro.product.name");    /** The name of the industrial design. */    public static final String DEVICE = getString("ro.product.device");    /** The name of the underlying board, like "goldfish". */    public static final String BOARD = getString("ro.product.board");    /** The name of the instruction set (CPU type + ABI convention) of native code. */    public static final String CPU_ABI = getString("ro.product.cpu.abi");    /** The name of the second instruction set (CPU type + ABI convention) of native code. */    public static final String CPU_ABI2 = getString("ro.product.cpu.abi2");    /** The manufacturer of the product/hardware. */    public static final String MANUFACTURER = getString("ro.product.manufacturer");    /** The brand (e.g., carrier) the software is customized for, if any. */    public static final String BRAND = getString("ro.product.brand");    /** The end-user-visible name for the end product. */    public static final String MODEL = getString("ro.product.model");    /** The system bootloader version number. */    public static final String BOOTLOADER = getString("ro.bootloader");


通过以上两种方法基本上可以解决掉该问题了.









Class clazz = Class.forName("android.os.SystemProperties");
Object o = clazz.newInstance();
Method method = clazz.getDeclaredMethod("get", String.class);
String miuiString = (String) method.invoke(o,
"ro.miui.ui.version.name");
if (miuiString != null && !"".equals(miuiString)) {
MIUI = true;
}



String dev = android.os.Build.MANUFACTURER;获取设备名字


0 0