您的位置:首页 > 移动开发 > Android开发

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

2016-11-17 15:28 567 查看
转自: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
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了。
// 检测MIUI
import 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;
}
}
}

//检测EMUI
public 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;
}
}
}

// 检测Flyme
import 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
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
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
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的定制商
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: