很多时候我们需要知道用户当前使用的是什么系统,甚至是系统的版本号(比如MIUI V7、V8)来进一步处理业务逻辑,比如打开系统权限设置界面。
感谢国内各大Android手机/系统生产商,让我们这些Android开发者每天都乐(伤)此(心)不(欲)疲(绝)的解决这些差异化问题。
1. 通过设备制造商判断
通过读取android.os.Build.MANUFACTURER
常量来获取设备的制造商从而确定设备所使用的系统。
常用MANUFACTURER
常量对应关系
仅供参照:不排除个别厂家有作更改
华为-huawei
魅族-meizu
小米-xiaomi
oppo-oppo
vivo-vivo
三星-samsung
锤子-smartisan
LG-lg
乐视-letv
中兴-zte
酷派-yulong
联想-lenovo
索尼-sony
使用示例:
//为了更好的判断,最好是将两者比较的对象都转换为大写或者小写再进行比较
val mark = Build.MANUFACTURER.toLowerCase()
if (mark.contains("huawei")) {//预防起见使用contains而不使用equals
//这是华为设备
}
总结:此方法通常有效,因为我们通常认为小米的手机使用MIUI系统,华为的手机使用EMUI系统等这种关联关系,那么就可能存在以下情况:
- 如果使用华为的手机刷小米的系统,这种得到的结果可能不准确。
- 未知设备制造商X使用未知Y系统,这种可能会导致无法穷觉有多少种情况,但可能我们也不关心这种情况,也许我们只关系国内比较有名气的那几家设备和系统生产商,比如小米、华为等,其它未知情况均可视为原生系统
当然如果还想获取系统的版本号,可能这个方法就有点无力回天了。
2. 通过build.prop
的内容判断
在Android系统中有一个类似Windows系统注册表的文件
build.prop
。这个文件内定义了系统初始(或永久)的一些参数属性、功能的开放等。
因此我们可以通过在文件内容中查找一些特征标识从而确定系统类别。
在对build.prop
进一步了解的过程中,找到了别人对这一部分的具体使用和讲解,这里就不再过多阐述。
别人的使用讲解
别人封装好的工具类
总结:此方法通常更为有效(取决于特征标识的有效性),但比方法1略复杂一些。但是此方法可能存在一个致命的问题就是可能在某些设备上你无法读取build.prop
文件,据网上资料显示(华为mate10 及后续的一些新设备无法读取此文件)。
对于以上两种方法,方式不同,也都存在各自的短板,因此在实际生产环境中最好是根据自己的需求而定,甚至是结合两者方法的特点来实现需求,到目前为止并没有找到其它更为行之有效能够适应所有情况的获取系统类型和版本的方法,如果有,谢天谢地请您告诉我,不胜感激。
附录:
小米开发文档-如何识别小米设备/MIUI系统,关于开发文档中提到的读取属性,应该是使用SystemUtil.java实现
更多参考资料:https://blog.csdn.net/xx326664162/article/details/52438706