Android应用获取系统属性
16lz
2021-01-26
使用adb shell prop可以查看Android系统的属性.详情看下图
上面列出了很多属性, 如果要在使用中使用该属性, 比如说我是为了判断该手机是不是魅族手机.
google在framework层提供了一个SystemProperties类, 该类位于框架层, 具体位置是frameworks/base/core/java/android/os/SystemProperties.java
该类提供了很详细的访问各种属性的方法,所以我可以使用反射机制来获取我想要的参数.
packageme.chasel.utilsimportjava.io.File;importjava.lang.reflect.Method;importandroid.content.Context;importdalvik.system.DexFile;publicclassSystemPropertiesProxy{/***根据给定Key获取值.*@return如果不存在该key则返回空字符串*@throwsIllegalArgumentException如果key超过32个字符则抛出该异常*/publicstaticStringget(Contextcontext,Stringkey)throwsIllegalArgumentException{Stringret="";try{ClassLoadercl=context.getClassLoader();@SuppressWarnings("rawtypes")ClassSystemProperties=cl.loadClass("android.os.SystemProperties");//参数类型@SuppressWarnings("rawtypes")Class[]paramTypes=newClass[1];paramTypes[0]=String.class;Methodget=SystemProperties.getMethod("get",paramTypes);//参数Object[]params=newObject[1];params[0]=newString(key);ret=(String)get.invoke(SystemProperties,params);}catch(IllegalArgumentExceptioniAE){throwiAE;}catch(Exceptione){ret="";//TODO}returnret;}/***根据Key获取值.*@return如果key不存在,并且如果def不为空则返回def否则返回空字符串*@throwsIllegalArgumentException如果key超过32个字符则抛出该异常*/publicstaticStringget(Contextcontext,Stringkey,Stringdef)throwsIllegalArgumentException{Stringret=def;try{ClassLoadercl=context.getClassLoader();@SuppressWarnings("rawtypes")ClassSystemProperties=cl.loadClass("android.os.SystemProperties");//参数类型@SuppressWarnings("rawtypes")Class[]paramTypes=newClass[2];paramTypes[0]=String.class;paramTypes[1]=String.class;Methodget=SystemProperties.getMethod("get",paramTypes);//参数Object[]params=newObject[2];params[0]=newString(key);params[1]=newString(def);ret=(String)get.invoke(SystemProperties,params);}catch(IllegalArgumentExceptioniAE){throwiAE;}catch(Exceptione){ret=def;//TODO}returnret;}/***根据给定的key返回int类型值.*@paramkey要查询的key*@paramdef默认返回值*@return返回一个int类型的值,如果没有发现则返回默认值*@throwsIllegalArgumentException如果key超过32个字符则抛出该异常*/publicstaticIntegergetInt(Contextcontext,Stringkey,intdef)throwsIllegalArgumentException{Integerret=def;try{ClassLoadercl=context.getClassLoader();@SuppressWarnings("rawtypes")ClassSystemProperties=cl.loadClass("android.os.SystemProperties");//参数类型@SuppressWarnings("rawtypes")Class[]paramTypes=newClass[2];paramTypes[0]=String.class;paramTypes[1]=int.class;MethodgetInt=SystemProperties.getMethod("getInt",paramTypes);//参数Object[]params=newObject[2];params[0]=newString(key);params[1]=newInteger(def);ret=(Integer)getInt.invoke(SystemProperties,params);}catch(IllegalArgumentExceptioniAE){throwiAE;}catch(Exceptione){ret=def;//TODO}returnret;}/***根据给定的key返回long类型值.*@paramkey要查询的key*@paramdef默认返回值*@return返回一个long类型的值,如果没有发现则返回默认值*@throwsIllegalArgumentException如果key超过32个字符则抛出该异常*/publicstaticLonggetLong(Contextcontext,Stringkey,longdef)throwsIllegalArgumentException{Longret=def;try{ClassLoadercl=context.getClassLoader();@SuppressWarnings("rawtypes")ClassSystemProperties=cl.loadClass("android.os.SystemProperties");//参数类型@SuppressWarnings("rawtypes")Class[]paramTypes=newClass[2];paramTypes[0]=String.class;paramTypes[1]=long.class;MethodgetLong=SystemProperties.getMethod("getLong",paramTypes);//参数Object[]params=newObject[2];params[0]=newString(key);params[1]=newLong(def);ret=(Long)getLong.invoke(SystemProperties,params);}catch(IllegalArgumentExceptioniAE){throwiAE;}catch(Exceptione){ret=def;//TODO}returnret;}/***根据给定的key返回boolean类型值.*如果值为'n','no','0','false'or'off'返回false.*如果值为'y','yes','1','true'or'on'返回true.*如果key不存在,或者是其它的值,则返回默认值.*@paramkey要查询的key*@paramdef默认返回值*@return返回一个boolean类型的值,如果没有发现则返回默认值*@throwsIllegalArgumentException如果key超过32个字符则抛出该异常*/publicstaticBooleangetBoolean(Contextcontext,Stringkey,booleandef)throwsIllegalArgumentException{Booleanret=def;try{ClassLoadercl=context.getClassLoader();@SuppressWarnings("rawtypes")ClassSystemProperties=cl.loadClass("android.os.SystemProperties");//参数类型@SuppressWarnings("rawtypes")Class[]paramTypes=newClass[2];paramTypes[0]=String.class;paramTypes[1]=boolean.class;MethodgetBoolean=SystemProperties.getMethod("getBoolean",paramTypes);//参数Object[]params=newObject[2];params[0]=newString(key);params[1]=newBoolean(def);ret=(Boolean)getBoolean.invoke(SystemProperties,params);}catch(IllegalArgumentExceptioniAE){throwiAE;}catch(Exceptione){ret=def;//TODO}returnret;}/***根据给定的key和值设置属性,该方法需要特定的权限才能操作.*@throwsIllegalArgumentException如果key超过32个字符则抛出该异常*@throwsIllegalArgumentException如果value超过92个字符则抛出该异常*/publicstaticvoidset(Contextcontext,Stringkey,Stringval)throwsIllegalArgumentException{try{@SuppressWarnings("unused")DexFiledf=newDexFile(newFile("/system/app/Settings.apk"));@SuppressWarnings("unused")ClassLoadercl=context.getClassLoader();@SuppressWarnings("rawtypes")ClassSystemProperties=Class.forName("android.os.SystemProperties");//参数类型@SuppressWarnings("rawtypes")Class[]paramTypes=newClass[2];paramTypes[0]=String.class;paramTypes[1]=String.class;Methodset=SystemProperties.getMethod("set",paramTypes);//参数Object[]params=newObject[2];params[0]=newString(key);params[1]=newString(val);set.invoke(SystemProperties,params);}catch(IllegalArgumentExceptioniAE){throwiAE;}catch(Exceptione){//TODO}}}
这是第一种方法, 这也是一种万能的方法.
当然如果不是非常必要的话, 建议还是不要使用这样的万能方法.
第二种方法是其它如果只是要简单的判断是否为魅族手机的话, 完全可以调用google提供的api来做.
android.os.Build.BRAND
使用上面的属性如果是魅族手机的话返回返回Meizu.
这是和我使用adb shell prop看到的属性是一致的, 可以看下图
看到该类的源码也可以看到如下内容
publicclassBuild{/**Valueusedforwhenabuildpropertyisunknown.*/publicstaticfinalStringUNKNOWN="unknown";/**Eitherachangelistnumber,oralabellike"M4-rc20".*/publicstaticfinalStringID=getString("ro.build.id");/**AbuildIDstringmeantfordisplayingtotheuser*/publicstaticfinalStringDISPLAY=getString("ro.build.display.id");/**Thenameoftheoverallproduct.*/publicstaticfinalStringPRODUCT=getString("ro.product.name");/**Thenameoftheindustrialdesign.*/publicstaticfinalStringDEVICE=getString("ro.product.device");/**Thenameoftheunderlyingboard,like"goldfish".*/publicstaticfinalStringBOARD=getString("ro.product.board");/**Thenameoftheinstructionset(CPUtype+ABIconvention)ofnativecode.*/publicstaticfinalStringCPU_ABI=getString("ro.product.cpu.abi");/**Thenameofthesecondinstructionset(CPUtype+ABIconvention)ofnativecode.*/publicstaticfinalStringCPU_ABI2=getString("ro.product.cpu.abi2");/**Themanufactureroftheproduct/hardware.*/publicstaticfinalStringMANUFACTURER=getString("ro.product.manufacturer");/**Thebrand(e.g.,carrier)thesoftwareiscustomizedfor,ifany.*/publicstaticfinalStringBRAND=getString("ro.product.brand");/**Theend-user-visiblenamefortheendproduct.*/publicstaticfinalStringMODEL=getString("ro.product.model");/**Thesystembootloaderversionnumber.*/publicstaticfinalStringBOOTLOADER=getString("ro.bootloader");
通过以上两种方法基本上可以解决掉该问题了.
更多相关文章
- ViewGroup中的onInterceptTouchEvent和onTouchEvent调用时序
- android retrofit2.0框架的使用介绍
- 集成Android(安卓)SlidingMenu(SlideMenu)
- Android(安卓)自动化测试(6)
- Cordova for android如何在App中处理退出按钮事件
- Android关于RecycleView不走onBindViewHolder和onCreateViewHold
- Android(安卓)studio上面学习Aidl实现复杂数据类型的传递
- 【Android(安卓)Developers Training】 29. 从Activity获得结果
- android使用HttpURLConnection上传文件同时提交参数