Android开发中,咱们总是会碰到各式各样的适配问题。假如要处理适配问题,咱们必须就要处理,出现问题的是什么机型?出现问题的是什么体系?怎样判别当前机型是不是出问题的机型?这几个问题。这篇文章,就将介绍怎么判别机型和体系,介绍目前应该怎么处理这些问题。

判别指定的机型

在Android里面能够经过android.os.Build这个类获取相关的机型信息,它的参数如下:(这里以一加的手机为例)

Build.BOARD=lahaina
Build.BOOTLOADER=unknown
Build.BRAND=OnePlus//品牌名
Build.CPU_ABI=arm64-v8a
Build.CPU_ABI2= 
Build.DEVICE=OP5154L1
Build.DISPLAY=MT2110_13.1.0.100(CN01) //设备版别号
Build.FINGERPRINT=OnePlus/MT2110_CH/OP5154L1:13/TP1A.220905.001/R.1038728_2_1:user/release-keys
Build.HARDWARE=qcom
Build.HOST=dg02-pool03-kvm97
Build.ID=TP1A.220905.001
Build.IS_DEBUGGABLE= false
Build.IS_EMULATOR= false
Build.MANUFACTURER=OnePlus//手机制造商
Build.MODEL=MT2110//手机类型
Build.ODM_SKU=unknown
Build.PERMISSIONS_REVIEW_REQUIRED= true
Build.PRODUCT=MT2110_CH//产品名称
Build.RADIO=unknown
Build.SERIAL =unknown
Build.SKU=unknown
Build.SOC_MANUFACTURER=Qualcomm
Build.SOC_MODEL=SM8350
Build.SUPPORTED_32_BIT_ABIS= [Ljava.lang.String;@fea6460
Build.SUPPORTED_64_BIT_ABIS= [Ljava.lang.String;@3a22d19
Build.SUPPORTED_ABIS= [Ljava.lang.String;@2101de
Build.TAGS= release-keys
Build.TIME = 1683196675000
Build.TYPE = user
Build.UNKNOWN=unknown
Build.USER =root

其间重要的特点现已设置了注释,一切的特点能够看官方文档。在这些特点中,咱们一般运用Build.MANUFACTURER来判别手机厂商,运用Build.MODEL来判别手机的类型。

tips:假如你是运用kotlin开发,能够运用android.os.Build::class.java.fields.map{"Build.${it.name}=${it.get(it.name)}"}.joinToString("\n")便利的获取一切的特点

上面的获取机型的代码在鸿蒙体系(HarmonyOS)上也相同适用,下面是在华为P50Pro的机型上测试打印的日志信息:

Android适配:判断机型和系统

Build.BOARD=JAD
Build.BOOTLOADER=unknown
Build.BRAND=HUAWEI
Build.CPU_ABI=arm64-v8a
Build.CPU_ABI2=
Build.DEVICE=HWJAD
Build.DISPLAY=JAD-AL502.0.0.225(C00E220R3P4)
Build.FINGERPRINT= HUAWEI/JAD-AL50/HWJAD:10/HUAWEIJAD-AL50/102.0.0.225C00:user/release-keys
Build.FINGERPRINTEX=HUAWEI/JAD-AL50/HWJAD:10/HUAWEIJAD-AL50/102.0.0.225C00:user/release-keys
Build.HARDWARE=kirin9000
Build.HIDE_PRODUCT_INFO=false
Build.HOST=cn-east-hcd-4a-d3a4cb6341634865598924-6cc66dddcd-dcg9d
Build.HWFINGERPRINT=///JAD-LGRP5-CHN2.0.0.225/JAD-AL50-CUST2.0.0.220(C00)/JAD-AL50-PRELOAD2.0.0.4(C00R3)//
Build.ID=HUAWEIJAD-AL50
Build.IS_CONTAINER=false
Build.IS_DEBUGGABLE=false
Build.IS_EMULATOR=false
Build.IS_ENG=false
Build.IS_TREBLE_ENABLED=true
Build.IS_USER=true
Build.IS_USERDEBUG=false
Build.MANUFACTURER=HUAWEI
Build.MODEL=JAD-AL50
Build.NO_HOTA=false
Build.PERMISSIONS_REVIEW_REQUIRED=true
Build.PRODUCT=JAD-AL50
Build.RADIO=unknown
Build.SERIAL=unknown
Build.SUPPORTED_32_BIT_ABIS=[Ljava.lang.String;@a90e093
Build.SUPPORTED_64_BIT_ABIS=[Ljava.lang.String;@8ce98d0
Build.SUPPORTED_ABIS=[Ljava.lang.String;@366a0c9
Build.TAGS=release-keys
Build.TIME=1634865882000
Build.TYPE=user
Build.UNKNOWN=unknown

判别手机厂商的代码如下:

//是否是荣耀设备
funisHonorDevice()=Build.MANUFACTURER.equals("HONOR",ignoreCase=true)
//是否是小米设备
funisXiaomiDevice()=Build.MANUFACTURER.equals("Xiaomi",ignoreCase=true)
//是否是oppo设备
//realme是oppo的海外品牌后边脱离了;一加是oppo的独立运营品牌。因而判别
//它们是需求独自判别
funisOppoDevice()=Build.MANUFACTURER.equals("OPPO",ignoreCase=true)
//是否是一加手机
funisOnePlusDevice()=Build.MANUFACTURER.equals("OnePlus",ignoreCase=true)
//是否是realme手机
funisRealmeDevice()=Build.MANUFACTURER.equals("realme",ignoreCase=true)
//是否是vivo设备
funisVivoDevice()=Build.MANUFACTURER.equals("vivo",ignoreCase=true)
//是否是华为设备
funisHuaweiDevice()=Build.MANUFACTURER.equals("HUAWEI",ignoreCase=true)

需求判别指定的类型的代码如下:

//判别是否是小米12s的机型
funisXiaomi12S()=isXiaomiDevice()&& Build.MODEL.contains("2206123SC")//xiaomi12s

假如你不知道对应机型的类型,能够看基于谷歌维护的表格,支撑超过27,000台设备。如下图所示:

Android适配:判断机型和系统

判别手机的体系

除了机型外,适配过程中咱们还需求考虑手机的体系。可是比较于手机机型,手机的体系的判别就没有统一的方法。下面介绍几个常用的os的判别

●鸿蒙

privatestaticfinalStringHARMONY_OS="harmony";
/**
*checkthesystemisharmonyos
*
*@returntrueifitisharmonyos
*/
publicstaticbooleanisHarmonyOS(){
try{
Classclz=Class.forName("com.huawei.system.BuildEx");
Methodmethod=clz.getMethod("getOsBrand");
returnHARMONY_OS.equals(method.invoke(clz));
}catch(ClassNotFoundExceptione){
Log.e(TAG,"occuredClassNotFoundException");
}catch(NoSuchMethodExceptione){
Log.e(TAG,"occuredNoSuchMethodException");
}catch(Exceptione){
Log.e(TAG,"occurotherproblem");
}
returnfalse;
}

●Miui

funcheckIsMiui()= !TextUtils.isEmpty(getSystemProperty("ro.miui.ui.version.name"))
privatefungetSystemProperty(propName:String):String?{
valline:String
varinput:BufferedReader?=null
try{
valp=Runtime.getRuntime().exec("getprop$propName")
input= BufferedReader(InputStreamReader(p.inputStream),1024)
line=input.readLine()
input.close()
}catch(ex:IOException){
Log.i(TAG,"Unabletoreadsysprop$propName",ex)
returnnull
}finally{
if(input!=null){
try{
input.close()
}catch(e:IOException){
Log.i(TAG,"ExceptionwhileclosingInputStream", e)
}
}
}
returnline
}

●Emui或者MagicUI

Emui是2018之前的荣耀机型的os,18年之后是MagicUI。前史联系如下图所示:

Android适配:判断机型和系统

判别的代码如下。需求注意是对于Android12以下的机型,官方文档并没有给出对于的计划,下面代码的方法是从网上找的,目前测试了4台不同的机型,均可正在判别。

funcheckIsEmuiOrMagicUI():Boolean{
returnif(Build.VERSION.SDK_INT>=31){
        //官方计划,可是只适用于api31以上(Android12)
try{
valclazz=Class.forName("com.hihonor.android.os.Build")
Log.d(TAG,"clazz="+clazz)
true
}catch(e:ClassNotFoundException){
Log.d(TAG,"nofindclass")
e.printStackTrace()
false
}
}else{
        //网上计划,测试了荣耀畅玩8C
        //荣耀20s、荣耀x40、荣耀v30pro四台机型,均可正常判别
!TextUtils.isEmpty(getSystemProperty("ro.build.version.emui"))
}
}

●ColorOs

下面是网上判别是否是Oppo的ColorOs的代码。经测试,在OPPOk10、oppofindx5pro、oneplus9RT手机上都是回来false,只要在realmeQ3pro机型上才回来了true。

//这段代码是错的
funcheckIsColorOs()=!TextUtils.isEmpty(getSystemProperty("ro.build.version.opporom"))

从测试结果能够看出上面这段代码是错的,可是在ColorOs的官网上,没有找到怎么判别ColorOs的代码。这种情况下,有几种计划:

1. 判别手机制造商,即Build.MANUFACTURER假如为oneplus、oppo、realme就以为它是ColorOs

2. 根据体系运用的包名判别,即判别是否带有com.coloros.* 的体系运用,假如有,就以为它是ColorOs

这几种计划都有很多问题,暂时没有找到更好的处理方法。

●OriginOs

//网上代码,在IQOQNeo5、vivoY50、vivox70三种机型上
//都能够正常判别
funcheckIsOriginOs()=!TextUtils.isEmpty(getSystemProperty("ro.vivo.os.version"))

总结

对于手机厂商和机型,咱们能够经过Android原生的android.os.Build类来判别。运用Build.MANUFACTURER来判别手机厂商,运用Build.MODEL来判别手机的类型。假如是不知道的类型,还能够尝试在谷歌维护的手机机型表格中查询。

可是对于厂商的体系,就没有统一的判别方法了。部分厂商有官方提供的判别方法,如Miui、MagicUI;部分厂商暂时没有找到相关的内容。这种情况下,只能经过网上的方法判别,可是部分内容也不靠谱,如判别Oppo的ColorOs。假如你有靠谱的方法,欢迎弥补。

参阅

  • GetAndroidPhoneModelprogrammatically,HowtogetDevicenameandmodelprogrammaticallyinandroid?
  • Android获取体系的硬件信息、体系版别以及怎么检测ROM类型
  • 关于判别设备是否搭载了鸿蒙体系
  • 判别MIUI版别及版别号
  • 怎么识别小米设备