原文: 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命令来得到数据或者通过反射

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

设备型号

vivo

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

小米

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

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

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

  1. public static String getDeviceName() {
  2. String deviceName = "";
  3. try {
  4. Class SystemProperties = Class.forName("android.os.SystemProperties");
  5. Method get = SystemProperties.getDeclaredMethod("get", String.class, String.class);
  6. deviceName = (String) get.invoke(SystemProperties, "ro.product.marketname", "");
  7. if (TextUtils.isEmpty(deviceName)) {
  8. deviceName = (String) get.invoke(SystemProperties, "ro.product.model", "");
  9. }
  10. } catch (InvocationTargetException | NoSuchMethodException | IllegalAccessException | ClassNotFoundException e) {
  11. e.printStackTrace();
  12. }
  13. return deviceName;
  14. }

工具类源码

点击展开代码
  1. package com.hlfonts.richway.widget.tool
  2. import android.os.Build
  3. import android.text.TextUtils
  4. import com.blankj.utilcode.util.ShellUtils
  5. import java.util.*
  6. /**
  7. * 工具类参考 https://blog.csdn.net/convex1009848621/article/details/120767000
  8. */
  9. object CustomOSUtils {
  10. /**
  11. * customOS默认值为"",如果识别出的手机厂商是预知的,会被重新赋值,如果未识别到该机型则返回原生安卓信息
  12. */
  13. private var customOS: String? = ""
  14. /**
  15. * CustomOSVersion默认值为"",如果识别出的手机厂商是预知的,会被重新赋值成对应rom系统的版本号
  16. * 如果未识别到该机型则返回原生安卓信息
  17. */
  18. private var customOSVersion: String? = ""
  19. /**
  20. * HarmonyOS 系统输出的
  21. * 格式:2.0.0
  22. */
  23. private const val KEY_HARMONYOS_VERSION_NAME = "hw_sc.build.platform.version"
  24. /**
  25. * EMUI系统输出的
  26. * 格式:EmotionUI_8.0.0
  27. */
  28. private const val KEY_EMUI_VERSION_NAME = "ro.build.version.emui"
  29. /**
  30. * MagicUI系统输出的
  31. * 格式:3.1.0
  32. */
  33. private const val KEY_MAGICUI_VERSION = "ro.build.version.magic"
  34. /**
  35. * MIUI系统输出的
  36. * 格式:V12
  37. */
  38. private const val KEY_MIUI_VERSION_NAME = "ro.miui.ui.version.name"
  39. /**
  40. * OPPO手机ColorOS系统输出的
  41. * 格式:9
  42. */
  43. private const val KEY_COLOROS_VERSION_NAME = "ro.build.version.opporom"
  44. /**
  45. * VIVO手机系统输出的
  46. * name格式:funtouch
  47. * version格式: 9
  48. */
  49. private const val KEY_VIVO_VERSION_NAME = "ro.vivo.os.name"
  50. private const val KEY_VIVO_VERSION = "ro.vivo.os.version"
  51. /**
  52. * OonPlus手机系统输出的
  53. * 格式:Hydrogen OS 11.0.7.10.KB05
  54. */
  55. private const val KEY_ONEPLUS_VERSION_NAME = "ro.rom.version"
  56. /**
  57. * 魅族手机系统输出的
  58. */
  59. private const val KEY_FLYME_VERSION_NAME = "ro.build.display.id"
  60. /**
  61. * nubia手机系统输出的
  62. */
  63. private const val KEY_NUBIA_VERSION_NAME = "ro.build.nubia.rom.name"
  64. private const val KEY_NUBIA_VERSION_CODE = "ro.build.nubia.rom.code"
  65. /**
  66. * 传入获取手机系统属性的key,可以得到rom系统版本信息
  67. * @param key
  68. * @return
  69. */
  70. private fun getSystemPropertyValue(key: String): String {
  71. val cmd = """
  72. getprop "$key"
  73. """.trimIndent()
  74. val cmdResult = ShellUtils.execCmd(cmd, false)
  75. return cmdResult.successMsg?:""
  76. }
  77. /**
  78. * 判断是否是华为鸿蒙系统,能否识别荣耀鸿蒙未知
  79. *
  80. * @return
  81. */
  82. private fun isHarmonyOS(): Boolean {
  83. val value = getHarmonyOsBrand()
  84. return TextUtils.isEmpty(value).not()
  85. }
  86. private fun getHarmonyOsBrand(): String {
  87. var result = ""
  88. kotlin.runCatching {
  89. val classType = Class.forName("com.huawei.system.BuildEx")
  90. val getMethod = classType.getMethod("getOsBrand")
  91. result = getMethod.invoke(classType) as String
  92. }
  93. return result
  94. }
  95. /**
  96. * 通过手机品牌信息获取手机rom系统+系统版本号
  97. * @param phoneBrand
  98. * @return 如 flyme 5.0
  99. */
  100. fun getPhoneSystemName(): String {
  101. if (TextUtils.isEmpty(customOS)) {
  102. setCustomOSInfo()
  103. }
  104. return "$customOS $customOSVersion"
  105. }
  106. private val isMagicUI: Boolean = false
  107. /**
  108. * 通过手机品牌信息获取手机rom系统
  109. * @param phoneBrand
  110. * @return
  111. */
  112. fun getCustomOS(): String? {
  113. if (TextUtils.isEmpty(customOS)) {
  114. setCustomOSInfo()
  115. }
  116. return customOS
  117. }
  118. /**
  119. * 通过手机品牌信息获取手机rom系统版本号
  120. * @param phoneBrand
  121. * @return
  122. */
  123. fun getCustomOSVersion(): String? {
  124. if (TextUtils.isEmpty(customOS)) {
  125. setCustomOSInfo()
  126. }
  127. return customOSVersion
  128. }
  129. /**
  130. * 删除字符串中的空格并全部转成大写
  131. * @param str
  132. * @return
  133. */
  134. private fun deleteSpaceAndToUpperCase(str: String): String {
  135. return if (TextUtils.isEmpty(str)) {
  136. ""
  137. } else str.replace(" ".toRegex(), "").uppercase(Locale.getDefault())
  138. }
  139. private fun setCustomOSInfo() {
  140. // 示例: xiaomi
  141. val phoneBrand = Build.BRAND
  142. try {
  143. when (deleteSpaceAndToUpperCase(phoneBrand)) {
  144. "HUAWEI" -> if (isHarmonyOS()) {
  145. customOSVersion = getSystemPropertyValue(KEY_HARMONYOS_VERSION_NAME)
  146. customOS = "Harmony"
  147. } else {
  148. customOS = "EMUI"
  149. customOSVersion = getSystemPropertyValue(KEY_EMUI_VERSION_NAME)
  150. }
  151. "HONOR" -> if (isHarmonyOS()) {
  152. customOS = "Harmony"
  153. if (!TextUtils.isEmpty(getSystemPropertyValue(KEY_HARMONYOS_VERSION_NAME))) {
  154. customOSVersion = getSystemPropertyValue(KEY_HARMONYOS_VERSION_NAME)
  155. } else {
  156. customOSVersion = ""
  157. }
  158. } else if (!TextUtils.isEmpty(getSystemPropertyValue(KEY_MAGICUI_VERSION))) {
  159. customOS = "MagicUI"
  160. customOSVersion = getSystemPropertyValue(KEY_MAGICUI_VERSION)
  161. } else {
  162. //格式:EmotionUI_8.0.0
  163. customOS = "EMUI"
  164. customOSVersion = getSystemPropertyValue(KEY_EMUI_VERSION_NAME)
  165. }
  166. "XIAOMI", "REDMI" -> {
  167. //格式:MIUIV12
  168. customOS = "MIUI"
  169. customOSVersion = getSystemPropertyValue(KEY_MIUI_VERSION_NAME)
  170. }
  171. "REALME", "OPPO" -> {
  172. //格式:ColorOSV2.1
  173. customOS = "ColorOS"
  174. customOSVersion = getSystemPropertyValue(KEY_COLOROS_VERSION_NAME)
  175. }
  176. "VIVO" -> {
  177. val result = getSystemPropertyValue("ro.vivo.os.build.display.id")
  178. if (result.isNotBlank()) {
  179. //格式: OriginOS 1.0
  180. val arr = result.split(" ")
  181. customOS = arr.first()
  182. customOSVersion = arr.last()
  183. } else {
  184. //格式:Funtouch9
  185. customOS = "Funtouch"
  186. customOSVersion = getSystemPropertyValue(KEY_VIVO_VERSION)
  187. }
  188. }
  189. "ONEPLUS" -> {
  190. //格式:Hydrogen OS 11.0.7.10.KB05
  191. customOS = "Hydrogen"
  192. customOSVersion = getSystemPropertyValue(KEY_ONEPLUS_VERSION_NAME)
  193. }
  194. "MEIZU" -> {
  195. //格式:Flyme 6.3.5.1G
  196. customOS = "Flyme"
  197. customOSVersion = getSystemPropertyValue(KEY_FLYME_VERSION_NAME)
  198. }
  199. "NUBIA" -> {
  200. //格式:nubiaUIV3.0
  201. customOS = getSystemPropertyValue(KEY_NUBIA_VERSION_NAME)
  202. customOSVersion = getSystemPropertyValue(KEY_NUBIA_VERSION_CODE)
  203. }
  204. else -> {
  205. customOS = "Android"
  206. customOSVersion = Build.VERSION.RELEASE
  207. }
  208. }
  209. } catch (e: Exception) {
  210. customOS = "Android"
  211. customOSVersion = Build.VERSION.RELEASE
  212. }
  213. }
  214. }

用法:

  1. 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. 外部文件使用django的models

    #外部文件使用django的models,需要配置django环境 import os if __name__ == '__main__': os.environ.setdefault("D ...

  2. Windows配置PHP的MongoDB扩展

    环境 Windows 10 PHP 5.6.40/8.1.11 配置 下载MongoDB扩展 下载地址:https://pecl.php.net/package/mongodb 下载PHP版本对应的扩 ...

  3. 3、Web前端学习规划:CSS - 学习规划系列文章

    CSS作为Web前端开发的第2种重要的语言,笔者建议在学了HTML之后进行.CSS主要是对于HTML做一个渲染,其也带了一些语言语法函数,功能也非常强大. 1. 简介: CSS(层叠样式表)是一种用于 ...

  4. DoraCloud桌面模板制作教程

    模板制作是桌面云部署时的一项重要工作.模板的质量直接影响到虚拟桌面业务运行的稳定性.安全性和用户体验.制作模板需要完成如下一些工作: 安装Windows桌面操作系统. 安装虚拟化平台相关的半虚拟化驱动 ...

  5. SpringMVC的执行流程及初始化流程

    今天大致来看一下Spring MVC的执行流程和初始化流程是什么样的 1,执行流程:也就是一个请求是怎么到我们Controller的 2,初始化流程:也就是那些 HandlerMapping.Hand ...

  6. .NET 云原生架构师训练营(模块二 基础巩固 引入)--学习笔记

    2.1 引入 http协议 web server && web application framework .net 与 .net core asp .net core web api ...

  7. Linux-nmon系统监控工具

    一.Nmon介绍 Nmon得名于 Nigel 的监控器,是IBM的员工 Nigel Griffiths 为 AIX 和 Linux 系统开发的,使用 Nmon 可以很轻松的监控系统的 CPU.内存.网 ...

  8. Linux--split命令(将一个大文件拆分成多个小文件)

    一.split命令简介 split是Linux系统中的一个文件拆分命令,它可以将一个大文件拆分成多个小文件.这对于处理大型文件,或者需要将数据分解到多个文件中的场景非常有用. 二.split命令的使用 ...

  9. Word-批量导出Word中的图片

    当我们需要把Word文件中的图片保存起来,你是如何导出Word图片呢?右键一张张保存图片吗?这效率太低了.如果文档中有大量的图片,这个方法会浪费很多时间. 下面给大家分享word如何批量导出图片的技巧 ...

  10. JOISC 2023 纪录

    记录一下 JOISC 2023 的做题记录 Day1 T1 Two Currencies 给定一棵树,在边上有总计 \(m\) 个检查站,经过一个检查站需要叫 \(1\) 枚金币或者若干枚银币.\(Q ...