使用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");


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

更多相关文章

  1. ViewGroup中的onInterceptTouchEvent和onTouchEvent调用时序
  2. android retrofit2.0框架的使用介绍
  3. 集成Android(安卓)SlidingMenu(SlideMenu)
  4. Android(安卓)自动化测试(6)
  5. Cordova for android如何在App中处理退出按钮事件
  6. Android关于RecycleView不走onBindViewHolder和onCreateViewHold
  7. Android(安卓)studio上面学习Aidl实现复杂数据类型的传递
  8. 【Android(安卓)Developers Training】 29. 从Activity获得结果
  9. android使用HttpURLConnection上传文件同时提交参数

随机推荐

  1. 体育迷的工作:安卓开发,上海,国内排名第一体
  2. android 用inten传递对象
  3. android 获取设备IMEI与序列号
  4. 64位Fedora中搭建Android环境没有兼容的3
  5. 2013.12.03(6) ——— android ActionbarSh
  6. UI组件之TextView及其子类(一)TextView和
  7. android 分享 api
  8. android中异步加载图片信息
  9. Android双列滑动表格(双表头不动)
  10. android 自带 xml解析