原文: Android 获取设备的CPU型号和设备型号-Stars-One的杂货小窝

之前整的项目的总结信息,可能不太全,凑合着用吧,代码在最下面一节

CPU型号数据

  • 华为: ro.mediatek.platform
  • vivo: ro.vivo.product.platform
  • oppo: ro.board.platform 或 ro.product.board
  • 三星: ro.board.platform
  • 小米: ro.soc.model

小米:

GKI 2.0 之前,/proc/cpuinfo 中包含 Hardware 相关信息,应用可以从中读取 cpu 型号信息;

GKI 2.0 之后,/proc/cpuinfo 中不再包含 Hardware 相关信息,应用无法从中读取到 cpu 型号信息,需要从 android.os.SystemProperties 中读取 ro.soc.model 属性信息。参考说明:关于 GKI 内核版本说明

建议优先从 android.os.SystemProperties 中读取 ro.soc.model 属性信息,若此属性信息为空,则再从 /proc/cpuinfo 中读取 Hardware 信息即可。

1.查看所有配置信息:

adb shell getprop

2.查看指定配置信息:

adb shell getprop [key]

如:查看设备型号:adb shell getprop “ro.product.model”

可以通过adb shell命令来得到数据或者通过反射

//通过shell命令
val cmdResult = ShellUtils.execCmd("getprop", false) //通过反射
val classType = Class.forName("android.os.SystemProperties")
val method = classType.getDeclaredMethod("get", String::class.java)
val result = method.invoke(classType, "ro.vivo.product.platform") as String //SM6225

设备型号

vivo

[ro.vivo.os.build.display.id]: [OriginOS 1.0]
[ro.vivo.os.name]: [Funtouch]
[ro.vivo.os.version]: [12.0]
[ro.vivo.market.name]: [vivo Y32]

小米

新增ro.product.marketname属性,值为手机设备名(上市机型名称);

历史已发布手机上设备型号的属性ro.product.model依然有效,以后新发布的机型上不再生效。请开发者及时适配。

建议应用优先读取属性ro.product.marketname,如果返回值不为空,这个值就是手机设备型号。如果此属性返回值为空,则读取之前的属性ro.product.model值

public static String getDeviceName() {
String deviceName = "";
try {
Class SystemProperties = Class.forName("android.os.SystemProperties");
Method get = SystemProperties.getDeclaredMethod("get", String.class, String.class);
deviceName = (String) get.invoke(SystemProperties, "ro.product.marketname", "");
if (TextUtils.isEmpty(deviceName)) {
deviceName = (String) get.invoke(SystemProperties, "ro.product.model", "");
}
} catch (InvocationTargetException | NoSuchMethodException | IllegalAccessException | ClassNotFoundException e) {
e.printStackTrace();
}
return deviceName;
}

工具类源码

点击展开代码
package com.hlfonts.richway.widget.tool

import android.os.Build
import android.text.TextUtils
import com.blankj.utilcode.util.ShellUtils
import java.util.* /**
* 工具类参考 https://blog.csdn.net/convex1009848621/article/details/120767000
*/
object CustomOSUtils {
/**
* customOS默认值为"",如果识别出的手机厂商是预知的,会被重新赋值,如果未识别到该机型则返回原生安卓信息
*/
private var customOS: String? = "" /**
* CustomOSVersion默认值为"",如果识别出的手机厂商是预知的,会被重新赋值成对应rom系统的版本号
* 如果未识别到该机型则返回原生安卓信息
*/
private var customOSVersion: String? = "" /**
* HarmonyOS 系统输出的
* 格式:2.0.0
*/
private const val KEY_HARMONYOS_VERSION_NAME = "hw_sc.build.platform.version" /**
* EMUI系统输出的
* 格式:EmotionUI_8.0.0
*/
private const val KEY_EMUI_VERSION_NAME = "ro.build.version.emui" /**
* MagicUI系统输出的
* 格式:3.1.0
*/
private const val KEY_MAGICUI_VERSION = "ro.build.version.magic" /**
* MIUI系统输出的
* 格式:V12
*/
private const val KEY_MIUI_VERSION_NAME = "ro.miui.ui.version.name" /**
* OPPO手机ColorOS系统输出的
* 格式:9
*/
private const val KEY_COLOROS_VERSION_NAME = "ro.build.version.opporom" /**
* VIVO手机系统输出的
* name格式:funtouch
* version格式: 9
*/
private const val KEY_VIVO_VERSION_NAME = "ro.vivo.os.name"
private const val KEY_VIVO_VERSION = "ro.vivo.os.version" /**
* OonPlus手机系统输出的
* 格式:Hydrogen OS 11.0.7.10.KB05
*/
private const val KEY_ONEPLUS_VERSION_NAME = "ro.rom.version" /**
* 魅族手机系统输出的
*/
private const val KEY_FLYME_VERSION_NAME = "ro.build.display.id" /**
* nubia手机系统输出的
*/
private const val KEY_NUBIA_VERSION_NAME = "ro.build.nubia.rom.name"
private const val KEY_NUBIA_VERSION_CODE = "ro.build.nubia.rom.code" /**
* 传入获取手机系统属性的key,可以得到rom系统版本信息
* @param key
* @return
*/
private fun getSystemPropertyValue(key: String): String {
val cmd = """
getprop "$key"
""".trimIndent()
val cmdResult = ShellUtils.execCmd(cmd, false)
return cmdResult.successMsg?:"" } /**
* 判断是否是华为鸿蒙系统,能否识别荣耀鸿蒙未知
*
* @return
*/
private fun isHarmonyOS(): Boolean {
val value = getHarmonyOsBrand()
return TextUtils.isEmpty(value).not()
} private fun getHarmonyOsBrand(): String {
var result = ""
kotlin.runCatching {
val classType = Class.forName("com.huawei.system.BuildEx")
val getMethod = classType.getMethod("getOsBrand")
result = getMethod.invoke(classType) as String
}
return result
} /**
* 通过手机品牌信息获取手机rom系统+系统版本号
* @param phoneBrand
* @return 如 flyme 5.0
*/
fun getPhoneSystemName(): String {
if (TextUtils.isEmpty(customOS)) {
setCustomOSInfo()
}
return "$customOS $customOSVersion"
} private val isMagicUI: Boolean = false /**
* 通过手机品牌信息获取手机rom系统
* @param phoneBrand
* @return
*/
fun getCustomOS(): String? {
if (TextUtils.isEmpty(customOS)) {
setCustomOSInfo()
}
return customOS
} /**
* 通过手机品牌信息获取手机rom系统版本号
* @param phoneBrand
* @return
*/
fun getCustomOSVersion(): String? {
if (TextUtils.isEmpty(customOS)) {
setCustomOSInfo()
}
return customOSVersion
} /**
* 删除字符串中的空格并全部转成大写
* @param str
* @return
*/
private fun deleteSpaceAndToUpperCase(str: String): String {
return if (TextUtils.isEmpty(str)) {
""
} else str.replace(" ".toRegex(), "").uppercase(Locale.getDefault())
} private fun setCustomOSInfo() {
// 示例: xiaomi
val phoneBrand = Build.BRAND
try {
when (deleteSpaceAndToUpperCase(phoneBrand)) {
"HUAWEI" -> if (isHarmonyOS()) {
customOSVersion = getSystemPropertyValue(KEY_HARMONYOS_VERSION_NAME)
customOS = "Harmony"
} else {
customOS = "EMUI"
customOSVersion = getSystemPropertyValue(KEY_EMUI_VERSION_NAME)
}
"HONOR" -> if (isHarmonyOS()) {
customOS = "Harmony"
if (!TextUtils.isEmpty(getSystemPropertyValue(KEY_HARMONYOS_VERSION_NAME))) {
customOSVersion = getSystemPropertyValue(KEY_HARMONYOS_VERSION_NAME)
} else {
customOSVersion = ""
}
} else if (!TextUtils.isEmpty(getSystemPropertyValue(KEY_MAGICUI_VERSION))) {
customOS = "MagicUI"
customOSVersion = getSystemPropertyValue(KEY_MAGICUI_VERSION)
} else {
//格式:EmotionUI_8.0.0
customOS = "EMUI"
customOSVersion = getSystemPropertyValue(KEY_EMUI_VERSION_NAME)
}
"XIAOMI", "REDMI" -> {
//格式:MIUIV12
customOS = "MIUI"
customOSVersion = getSystemPropertyValue(KEY_MIUI_VERSION_NAME)
}
"REALME", "OPPO" -> {
//格式:ColorOSV2.1
customOS = "ColorOS"
customOSVersion = getSystemPropertyValue(KEY_COLOROS_VERSION_NAME)
}
"VIVO" -> {
val result = getSystemPropertyValue("ro.vivo.os.build.display.id")
if (result.isNotBlank()) {
//格式: OriginOS 1.0
val arr = result.split(" ")
customOS = arr.first()
customOSVersion = arr.last()
} else {
//格式:Funtouch9
customOS = "Funtouch"
customOSVersion = getSystemPropertyValue(KEY_VIVO_VERSION)
}
}
"ONEPLUS" -> {
//格式:Hydrogen OS 11.0.7.10.KB05
customOS = "Hydrogen"
customOSVersion = getSystemPropertyValue(KEY_ONEPLUS_VERSION_NAME)
}
"MEIZU" -> {
//格式:Flyme 6.3.5.1G
customOS = "Flyme"
customOSVersion = getSystemPropertyValue(KEY_FLYME_VERSION_NAME)
}
"NUBIA" -> {
//格式:nubiaUIV3.0
customOS = getSystemPropertyValue(KEY_NUBIA_VERSION_NAME)
customOSVersion = getSystemPropertyValue(KEY_NUBIA_VERSION_CODE)
}
else -> {
customOS = "Android"
customOSVersion = Build.VERSION.RELEASE
}
}
} catch (e: Exception) {
customOS = "Android"
customOSVersion = Build.VERSION.RELEASE
}
}
}

用法:

CustomOSUtils.getPhoneSystemName()

参考

Android 获取设备的CPU型号和设备型号的更多相关文章

  1. android获取设备唯一标示

    概述 有时需要对用户设备进行标识,所以希望能够得到一个稳定可靠并且唯一的识别码.虽然Android系统中提供了这样设备识别码,但是由于Android系统版本.厂商定制系统中的Bug等限制,稳定性和唯一 ...

  2. Android 设备的CPU类型(通常称为”ABIs”)

    armeabiv-v7a: 第7代及以上的 ARM 处理器.2011年15月以后的生产的大部分Android设备都使用它. arm64-v8a: 第8代.64位ARM处理器,很少设备,三星 Galax ...

  3. Android 获取设备唯一标识码

    概述 有时需要对用户设备进行标识,所以希望能够得到一个稳定可靠并且唯一的识别码.虽然Android系统中提供了这样设备识别码,但是由于Android系统版本.厂商定制系统中的Bug等限制,稳定性和唯一 ...

  4. 【转】 android获取设备唯一标识完美解决方案

    <p style="margin: 10px auto; padding-top: 0px; padding-bottom: 0px; color: rgb(51, 51, 51);  ...

  5. 获取Android设备的唯一识别码|设备号|序号|UUID

    如何获取一个能唯一标识每台Android设备的序号? 这个问题有很多答案,但是他们中的大部分只在某些情况下有效. 根据测试: 所有的设备都可以返回一个 TelephonyManager.getDevi ...

  6. 获取当前设备的CPU个数

    public class Test { public static void main(String[] args) { //获取当前设备的CPU个数 int availableProcessors ...

  7. Android 获取手机(ios,android)的设备唯一码(mac地址, IMEI)

    { /*获取手机(ios,android)的设备唯一码(mac地址, IMEI)2018年02月16日 ⁄ 综合 ⁄ 共 2697字 ⁄ 字号 小 中 大 ⁄ 评论关闭 app中总会用到客户端下载量数 ...

  8. android -------- 获取手机设备信息

    最近在开发中,需要用到一些系统信息,总结了一下 /** * Created by zhangqie on 2019/2/26 * Describe: 系统工具类 */ public class Equ ...

  9. Android获取cpu和内存信息、网址的代码

      android获取手机cpu并判断是单核还是多核 /** * Gets the number of cores available in this device, across all proce ...

  10. 【Android 应用开发】Android屏幕适配解析 - 详解像素,设备独立像素,归一化密度,精确密度及各种资源对应的尺寸密度分辨率适配问题

    . 作者 :万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/19698511 . 最近遇到了一系列的屏幕适配问题, 以及 ...

随机推荐

  1. React框架运行机制

    React框架运行主流程 1.JSX是JS语言的扩展,被babel编译后,会转换成React.creatElement(),这个方法返回的是一个虚拟DOM. 2.将虚拟DOM渲染到真实DOM的方法是R ...

  2. 单片机 IAP 技术方案设计

    1.前言 关于 IAP 技术,做过 bootloader 的想必很熟悉 (IAP全称 In Application Programming,即应用编程),和 ISP (全称 In System Pro ...

  3. 探索Web API SpeechSynthesis:给你的网页增添声音

    Web API SpeechSynthesis是一项强大的浏览器功能,它允许开发者将文本转换为语音,并通过浏览器播放出来.本文将深入探讨SpeechSynthesis的控制接口,包括其功能.用法和一个 ...

  4. MySQL-正则表达式规范

    MySQL中的正则表达式采用的是PCRE的规范,匹配时按字符进行. RLIKE 您可以使用RLIKE语句匹配正则表达式,支持的元字符如下表所示. 元字符 说明 ^ 行首. $ 行尾. . 任意字符. ...

  5. ultraISO方式制作win10安装U盘

    说明 最近帮朋友安装下win10,用了2种制作U盘启动盘的方式.记录一下也方便大家少走弯路. 准备的工具: 1.utralISO(软通牒) 2.win10镜像 3.16GB U盘,U盘容量 > ...

  6. bootstrap响应式网页布局

    bootstrap可以说是没有布局和审美概念的后端狗的福利.使用它的栅格系统可以轻松的对网页进行布局,而且可以做到响应式的布局.看起来很酷,接下来我就会总结自己在开发博客系统中用到的知识点及实战案例给 ...

  7. 骨牌铺方格 SDUT

    状态转移方程:dp[i] = dp[i - 1] + dp[i - 2]. 当前行,可能是由上一行转移过来的,那么当前行就只能横着铺,所以方案数是dp[i - 1]. 当前行,可能是由i-2行转移过来 ...

  8. C++ 多线程的错误和如何避免(15)

    尽量不使用无锁架构,除非绝对必要 复杂性中有一些东西吸引了每一位工程师.与常规同步机制(如互斥锁.条件变量.异步等)相比,无锁编程听起来非常性感.然而,与我交谈过的每一位经验丰富的 C++ 开发人员都 ...

  9. Docker实践之09-高级网络配置

    目录 一.Docker网络原理及默认配置 二.Docker网络定制配置参数 三.容器访问控制原理 1.容器访问外部网络 2.容器之间访问 3.访问所有端口 4.访问指定端口 5.映射容器端口到主机端口 ...

  10. Docker实践之06-访问仓库

    目录 什么是仓库 一.Docker Hub 注册 登录 拉取镜像 推送镜像 自动创建 二.私有仓库 Docker Registry 安装Docker Registry 在私有仓库上传/搜索/下载镜像 ...