Android 獲取設備的CPU型號和設備型號

来源:https://www.cnblogs.com/stars-one/p/18066008
-Advertisement-
Play Games

原文: Android 獲取設備的CPU型號和設備型號-Stars-One的雜貨小窩 之前整的項目的總結信息,可能不太全,湊合著用吧,代碼在最下麵一節 CPU型號數據 華為: ro.mediatek.platform vivo: ro.vivo.product.platform oppo: ro.b ...


原文: 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()

參考


提問之前,請先看提問須知 點擊右側圖標發起提問 聯繫我 或者加入QQ群一起學習 Stars-One安卓學習交流群 TornadoFx學習交流群:1071184701
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本期課程將從管理平臺的架構出發,結合平臺的實例管理、實例升級、容災管理和監控告警的功能和操作介紹,全面覆蓋日常運維操作,帶您理解並熟練運用GaussDB運維平臺完成運維工作。 ...
  • 索引相關 類型隱式轉換 大坑 **欄位filed1是varchar類型,且加了索引,如果 where filed1 = 123; type 可能是all,因為123是數字類型,mysql內部會用函數做隱式轉換,用了函數,索引就失效了。** 大數據深度分頁,用主鍵 select field1,fiel ...
  • 推薦:SQL語句執行順序相關問題。 MySQL Server架構 分層概述 MySQL Server架構可抽象為3層。 連接層:驗證用戶名密碼,認證成功後,獲取當前賬號的許可權並緩存,並分配TCP連接池和線程池資源。 處理層:實現核心的處理功能。 存儲層:將處理後的數據高性能安全的寫入磁碟,或從磁碟中 ...
  • 在 Walrus 平臺上,運維團隊在資源定義(Resource Definition)中聲明提供的資源類型,通過設置匹配規則,將不同的資源部署模板應用到不同類型的環境、項目等。與此同時,研發人員無需關註底層具體實現方式,通過創建 Resource 對象聲明需要使用的資源類型及基本信息,就可以靈活地在 ...
  • 掌握這幾種SQL進階用法,你將能夠更高效地處理各種複雜的數據操作,並少走很多彎路。這些技巧能夠提高你的SQL查詢能力,使得你在日常的數據處理工作中更得心應手。 ...
  • 什麼是MySQL的頁? 頁是指存儲引擎使用的最小的數據存儲單位。 當 MySQL 執行讀取或寫入操作時,是以頁為基本單位來進行操作的。即使讀寫一條數據,MySQL 也會按頁操作。 MySQL 的存儲引擎會將數據分成多個頁,並根據需要將這些頁載入到記憶體中進行處理。 通過使用頁來組織數據,MySQL 能 ...
  • 搭建Redis三主三從集群的詳細步驟如下: 準備環境: 確保你有六台伺服器或虛擬機,每台伺服器上都已經安裝了Redis。這些伺服器將用於搭建三主三從的Redis集群。 確保所有伺服器之間的網路連接正常,並且防火牆設置允許Redis通信。 安裝Redis: 在每台伺服器上下載並安裝Redis。你可以從 ...
  • 結論:當一個事務要對錶進行鎖定時,首先會獲取相應的意向鎖。其他事務可以通過檢查意向鎖來判斷是否有其他事務在更細粒度的級別上對錶進行了鎖定。這有助於避免衝突和提高併發性能 在討論此問題之前我們應當明確兩個前提: Innodb存儲引擎支持行鎖和表鎖共存 行鎖與表鎖之間互不衝突 意向鎖是表級別的鎖,意向鎖 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 微服務架構已經成為搭建高效、可擴展系統的關鍵技術之一,然而,現有許多微服務框架往往過於複雜,使得我們普通開發者難以快速上手並體驗到微服務帶了的便利。為瞭解決這一問題,於是作者精心打造了一款最接地氣的 .NET 微服務框架,幫助我們輕鬆構建和管理微服務應用。 本框架不僅支持 Consul 服務註 ...
  • 先看一下效果吧: 如果不會寫動畫或者懶得寫動畫,就直接交給Blend來做吧; 其實Blend操作起來很簡單,有點類似於在操作PS,我們只需要設置關鍵幀,滑鼠點來點去就可以了,Blend會自動幫我們生成我們想要的動畫效果. 第一步:要創建一個空的WPF項目 第二步:右鍵我們的項目,在最下方有一個,在B ...
  • Prism:框架介紹與安裝 什麼是Prism? Prism是一個用於在 WPF、Xamarin Form、Uno 平臺和 WinUI 中構建鬆散耦合、可維護和可測試的 XAML 應用程式框架 Github https://github.com/PrismLibrary/Prism NuGet htt ...
  • 在WPF中,屏幕上的所有內容,都是通過畫筆(Brush)畫上去的。如按鈕的背景色,邊框,文本框的前景和形狀填充。藉助畫筆,可以繪製頁面上的所有UI對象。不同畫筆具有不同類型的輸出( 如:某些畫筆使用純色繪製區域,其他畫筆使用漸變、圖案、圖像或繪圖)。 ...
  • 前言 嗨,大家好!推薦一個基於 .NET 8 的高併發微服務電商系統,涵蓋了商品、訂單、會員、服務、財務等50多種實用功能。 項目不僅使用了 .NET 8 的最新特性,還集成了AutoFac、DotLiquid、HangFire、Nlog、Jwt、LayUIAdmin、SqlSugar、MySQL、 ...
  • 本文主要介紹攝像頭(相機)如何採集數據,用於類似攝像頭本地顯示軟體,以及流媒體數據傳輸場景如傳屏、視訊會議等。 攝像頭採集有多種方案,如AForge.NET、WPFMediaKit、OpenCvSharp、EmguCv、DirectShow.NET、MediaCaptre(UWP),網上一些文章以及 ...
  • 前言 Seal-Report 是一款.NET 開源報表工具,擁有 1.4K Star。它提供了一個完整的框架,使用 C# 編寫,最新的版本採用的是 .NET 8.0 。 它能夠高效地從各種資料庫或 NoSQL 數據源生成日常報表,並支持執行複雜的報表任務。 其簡單易用的安裝過程和直觀的設計界面,我們 ...
  • 背景需求: 系統需要對接到XXX官方的API,但因此官方對接以及管理都十分嚴格。而本人部門的系統中包含諸多子系統,系統間為了穩定,程式間多數固定Token+特殊驗證進行調用,且後期還要提供給其他兄弟部門系統共同調用。 原則上:每套系統都必須單獨接入到官方,但官方的接入複雜,還要官方指定機構認證的證書 ...
  • 本文介紹下電腦設備關機的情況下如何通過網路喚醒設備,之前電源S狀態 電腦Power電源狀態- 唐宋元明清2188 - 博客園 (cnblogs.com) 有介紹過遠程喚醒設備,後面這倆天瞭解多了點所以單獨加個隨筆 設備關機的情況下,使用網路喚醒的前提條件: 1. 被喚醒設備需要支持這WakeOnL ...
  • 前言 大家好,推薦一個.NET 8.0 為核心,結合前端 Vue 框架,實現了前後端完全分離的設計理念。它不僅提供了強大的基礎功能支持,如許可權管理、代碼生成器等,還通過採用主流技術和最佳實踐,顯著降低了開發難度,加快了項目交付速度。 如果你需要一個高效的開發解決方案,本框架能幫助大家輕鬆應對挑戰,實 ...