Android获取系统的硬件信息 系统版本以及如何检测ROM类型

                       

转载请标明出处:http://blog.csdn.net/xx326664162/article/details/52438706    文章出自:薛瑄的博客

你也可以查看我的其他同类文章,也会让你有一定的收货

一、获取手机信息

Android获取手机制作商,系统版本等

获取Android 的Rom信息,以及判断是否为MIUI及获取MIUI版本

在开发中 我们有时候会需要获取当前手机的系统版本来进行判断,或者需要获取一些当前手机的硬件信息。

android.os.Build类中。包括了这样的一些信息。我们可以直接调用 而不需要添加任何的权限和方法。

android.os.Build.BOARD:获取设备基板名称
android.os.Build.BOOTLOADER:获取设备引导程序版本号
android.os.Build.BRAND:获取设备品牌

android.os.Build.CPU_ABI:获取设备指令集名称(CPU的类型)

android.os.Build.CPU_ABI2:获取第二个指令集名称

android.os.Build.DEVICE:获取设备驱动名称
android.os.Build.DISPLAY:获取设备显示的版本包(在系统设置中显示为版本号)和ID一样
android.os.Build.FINGERPRINT:设备的唯一标识。由设备的多个信息拼接合成。

android.os.Build.HARDWARE:设备硬件名称,一般和基板名称一样(BOARD)

android.os.Build.HOST:设备主机地址
android.os.Build.ID:设备版本号。

android.os.Build.MODEL :获取手机的型号 设备名称。

android.os.Build.MANUFACTURER:获取设备制造商

android:os.Build.PRODUCT:整个产品的名称

android:os.Build.RADIO:无线电固件版本号,通常是不可用的 显示unknown
android.os.Build.TAGS:设备标签。如release-keys 或测试的 test-keys

android.os.Build.TIME:时间

android.os.Build.TYPE:设备版本类型  主要为”user” 或”eng”.

android.os.Build.USER:设备用户名 基本上都为android-build

android.os.Build.VERSION.RELEASE:获取系统版本字符串。如4.1.2 或2.2 或2.3等

android.os.Build.VERSION.CODENAME:设备当前的系统开发代号,一般使用REL代替
android.os.Build.VERSION.INCREMENTAL:系统源代码控制值,一个数字或者git hash值

android.os.Build.VERSION.SDK:系统的API级别 一般使用下面大的SDK_INT 来查看

android.os.Build.VERSION.SDK_INT:系统的API级别 数字表示

android.os.Build.VERSION_CODES类 中有所有的已公布的Android版本号。全部是Int常亮。可用于与SDK_INT进行比较来判断当前的系统版本

示例代码:

//BOARD 主板String phoneInfo = "BOARD: " + android.os.Build.BOARD;phoneInfo += ", BOOTLOADER: " + android.os.Build.BOOTLOADER;//BRAND 运营商phoneInfo += ", BRAND: " + android.os.Build.BRAND;phoneInfo += ", CPU_ABI: " + android.os.Build.CPU_ABI;phoneInfo += ", CPU_ABI2: " + android.os.Build.CPU_ABI2;//DEVICE 驱动phoneInfo += ", DEVICE: " + android.os.Build.DEVICE;//DISPLAY Rom的名字 例如 Flyme 1.1.2(魅族rom)  JWR66V(Android nexus系列原生4.3rom)phoneInfo += ", DISPLAY: " + android.os.Build.DISPLAY;//指纹phoneInfo += ", FINGERPRINT: " + android.os.Build.FINGERPRINT;//HARDWARE 硬件phoneInfo += ", HARDWARE: " + android.os.Build.HARDWARE;phoneInfo += ", HOST: " + android.os.Build.HOST;phoneInfo += ", ID: " + android.os.Build.ID;//MANUFACTURER 生产厂家phoneInfo += ", MANUFACTURER: " + android.os.Build.MANUFACTURER;//MODEL 机型phoneInfo += ", MODEL: " + android.os.Build.MODEL;phoneInfo += ", PRODUCT: " + android.os.Build.PRODUCT;phoneInfo += ", RADIO: " + android.os.Build.RADIO;phoneInfo += ", RADITAGSO: " + android.os.Build.TAGS;phoneInfo += ", TIME: " + android.os.Build.TIME;phoneInfo += ", TYPE: " + android.os.Build.TYPE;phoneInfo += ", USER: " + android.os.Build.USER;//VERSION.RELEASE 固件版本phoneInfo += ", VERSION.RELEASE: " + android.os.Build.VERSION.RELEASE;phoneInfo += ", VERSION.CODENAME: " + android.os.Build.VERSION.CODENAME;//VERSION.INCREMENTAL 基带版本phoneInfo += ", VERSION.INCREMENTAL: " + android.os.Build.VERSION.INCREMENTAL;//VERSION.SDK SDK版本phoneInfo += ", VERSION.SDK: " + android.os.Build.VERSION.SDK;phoneInfo += ", VERSION.SDK_INT: " + Android.os.Build.VERSION.SDK_INT;
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36

二、检测ROM类型

在开发过程中,可能需要判断系统的ROM信息,检测ROM类型是MIUI、EMUI、还是Flyme。但是又不能只根据手机的生产厂家(android.os.Build.MANUFACTURER)来判断,因为要考虑到刷机的用户。比如说华为手机刷了MIUI系统。

2.1、根据系统基本配置文件build.prop检测ROM类型

[Android]判断是否是华为EMUI系统
有没有API 判断Android 系统是MIUI 的,魅族的Flyme ,还是原生的?
如何识别小米设备/MIUI系统

检测ROM类型是MIUI、EMUI、还是Flyme

  • MIUI 的系统属性字段为 ro.miui.ui.version.code 和 ro.miui.ui.version.name
  • 根据系统基本配置文件build.prop获取华为的ROM等级,知道了等级就知道是否是华为的ROM了。
// 检测MIUIimport java.io.IOException;public final class MIUIUtils {    private static final String KEY_MIUI_VERSION_CODE = "ro.miui.ui.version.code";    private static final String KEY_MIUI_VERSION_NAME = "ro.miui.ui.version.name";    private static final String KEY_MIUI_INTERNAL_STORAGE = "ro.miui.internal.storage";    public static boolean isMIUI() {        try {        //BuildProperties 是一个工具类,下面会给出代码            final BuildProperties prop = BuildProperties.newInstance();            return prop.getProperty(KEY_MIUI_VERSION_CODE, null) != null                    || prop.getProperty(KEY_MIUI_VERSION_NAME, null) != null                    || prop.getProperty(KEY_MIUI_INTERNAL_STORAGE, null) != null;        } catch (final IOException e) {            return false;        }    }}//检测EMUIpublic final class EMUIUtils {    private static final String KEY_EMUI_VERSION_CODE = "ro.build.hw_emui_api_level";    public static boolean isEMUI() {        try {        //BuildProperties 是一个工具类,下面会给出代码            final BuildProperties prop = BuildProperties.newInstance();            return prop.getProperty(KEY_EMUI_VERSION_CODE, null) != null;        } catch (final IOException e) {            return false;        }    }}// 检测Flymeimport android.os.Build;import java.lang.reflect.Method;public final class FlymeUtils {    public static boolean isFlyme() {        try {            // Invoke Build.hasSmartBar()            final Method method = Build.class.getMethod("hasSmartBar");            return method != null;        } catch (final Exception e) {            return false;        }    }}//引用到的工具类import android.os.Environment;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.util.Collection;import java.util.Enumeration;import java.util.Map.Entry;import java.util.Properties;import java.util.Set;public class BuildProperties {    private final Properties properties;    private BuildProperties() throws IOException {        properties = new Properties();        properties.load(new FileInputStream(new File(Environment.getRootDirectory(), "build.prop")));    }    public boolean containsKey(final Object key) {        return properties.containsKey(key);    }    public boolean containsValue(final Object value) {        return properties.containsValue(value);    }    public Set<Entry<Object, Object>> entrySet() {        return properties.entrySet();    }    public String getProperty(final String name) {        return properties.getProperty(name);    }    public String getProperty(final String name, final String defaultValue) {        return properties.getProperty(name, defaultValue);    }    public boolean isEmpty() {        return properties.isEmpty();    }    public Enumeration<Object> keys() {        return properties.keys();    }    public Set<Object> keySet() {        return properties.keySet();    }    public int size() {        return properties.size();    }    public Collection<Object> values() {        return properties.values();    }    public static BuildProperties newInstance() throws IOException {        return new BuildProperties();    }}
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122

2.2、代码中执行Android shell命令,检测ROM类型

怎么用代码判断Android手机的Rom是MIUI及获取MIUI版本

在Android shell模式下输入 getprop 就能获取系统属性值

如果Rom是MIUI那么就会有以下字段.
 [ro.miui.ui.version.code]: [3]
[ro.miui.ui.version.name]: [V5]

那么只要用一下代码获取就能知道是不是UI了.

getSystemProperty("ro.miui.ui.version.name")
   
   
  • 1
public static String getSystemProperty(String propName){            String line;            BufferedReader input = null;    try    {            Process p = Runtime.getRuntime().exec("getprop " + propName);        input = new BufferedReader(new InputStreamReader(p.getInputStream()), 1024);        line = input.readLine();        input.close();    }    catch (IOException ex)    {            Log.e(TAG, "Unable to read sysprop " + propName, ex);            return null;    }    finally    {            if(input != null)            {                            try                            {                                    input.close();                            }                            catch (IOException e)                            {                                    Log.e(TAG, "Exception while closing InputStream", e);                            }            }    }    return line;}
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

第二种和第三种方法,理论上可以判断各种ROM的类型,主要就是字段要选择正确,比如MIUI,小米官方有给出,若官方没有给出,就只能自己判断哪个字段可以担此大任。一般系统ROM等级都有一个内部版本号,就是不错的选择。例如:小米ro.miui.ui.version.code,华为ro.build.hw_emui_api_level

其它参考:

Android手机获取系统rom的定制商

 

关注我的公众号,轻松了解和学习更多技术
  这里写图片描述

           

猜你喜欢

转载自blog.csdn.net/qq_44949789/article/details/89646581