获取系统信息
public class SimpleDeviceUtils {public enum SystemType {/*** 小米手机(MIUI系统)*/SYS_MIUI,/*** 华为手机(EMUI系统)*/SYS_EMUI,/*** 魅族手机,FLYME系统*/SYS_FLYME,/*** 其他系统*/SYS_OTHER}private static final String KEY_MIUI_VERSION_NAME = "ro.miui.ui.version.name";private static final String KEY_MIUI_VERSION_CODE = "ro.miui.ui.version.code";private static final String KEY_MIUI_INTERNAL_STORAGE = "ro.miui.internal.storage";private static final String KEY_EMUI_API_LEVEL = "ro.build.hw_emui_api_level";private static final String KEY_EMUI_VERSION = "ro.build.version.emui";private static final String KEY_EMUI_CONFIG_HW_SYS_VERSION = "ro.confg.hw_systemversion";/*** 8.0之后有些系统信息获取不到,没有在各种版本手机上逐一测试*/public static SystemType getSystemType() {try {Properties prop = new Properties();prop.load(new FileInputStream(new File(Environment.getRootDirectory(), "build.prop")));if (Build.MANUFACTURER.toLowerCase().equals("xiaomi")//官方提供的判断是否为小米手机(而非MIUI系统)的方法|| prop.getProperty(KEY_MIUI_VERSION_NAME, null) != null//QMUI提供的判断是否是MIUI的方法|| prop.getProperty(KEY_MIUI_VERSION_CODE, null) != null//下面两个是网上补充的方法,感觉没必要的|| prop.getProperty(KEY_MIUI_INTERNAL_STORAGE, null) != null) {return SystemType.SYS_MIUI;} else if (isEMUI()//华为|| prop.getProperty(KEY_EMUI_API_LEVEL, null) != null|| prop.getProperty(KEY_EMUI_VERSION, null) != null|| prop.getProperty(KEY_EMUI_CONFIG_HW_SYS_VERSION, null) != null) {return SystemType.SYS_EMUI;} else if (isMeizu()//魅族推送SDK中提供的判断是否是魅族的方法|| DeviceHelper.isMeizu()) {//QMUI提供的判断是否是魅族的方法return SystemType.SYS_FLYME;}} catch (IOException e) {e.printStackTrace();}return SystemType.SYS_OTHER;}@SuppressLint("PrivateApi")private static boolean isEMUI() {Class<?>[] clsArray = new Class<?>[]{String.class};Object[] objArray = new Object[]{"ro.build.version.emui"};try {Class<?> SystemPropertiesClass = Class.forName("android.os.SystemProperties");Method get = SystemPropertiesClass.getDeclaredMethod("get", clsArray);String version = (String) get.invoke(SystemPropertiesClass, objArray);Log.i("bqt", "EMUI version is:" + version);return !TextUtils.isEmpty(version);} catch (Exception e) {e.printStackTrace();}return false;}/*** 判断是否为魅族设备*/private static boolean isMeizu() {String model = SystemProperties.get("ro.meizu.product.model");return (!TextUtils.isEmpty(model)) || "meizu".equalsIgnoreCase(Build.BRAND) || "22c4185e".equalsIgnoreCase(Build.BRAND);}}
1801
public class SimpleDeviceUtils {
2
3
public enum SystemType {
4
/**
5
* 小米手机(MIUI系统)
6
*/
7
SYS_MIUI,
8
/**
9
* 华为手机(EMUI系统)
10
*/
11
SYS_EMUI,
12
/**
13
* 魅族手机,FLYME系统
14
*/
15
SYS_FLYME,
16
/**
17
* 其他系统
18
*/
19
SYS_OTHER
20
}
21
22
private static final String KEY_MIUI_VERSION_NAME = "ro.miui.ui.version.name";
23
private static final String KEY_MIUI_VERSION_CODE = "ro.miui.ui.version.code";
24
private static final String KEY_MIUI_INTERNAL_STORAGE = "ro.miui.internal.storage";
25
26
private static final String KEY_EMUI_API_LEVEL = "ro.build.hw_emui_api_level";
27
private static final String KEY_EMUI_VERSION = "ro.build.version.emui";
28
private static final String KEY_EMUI_CONFIG_HW_SYS_VERSION = "ro.confg.hw_systemversion";
29
30
/**
31
* 8.0之后有些系统信息获取不到,没有在各种版本手机上逐一测试
32
*/
33
public static SystemType getSystemType() {
34
try {
35
Properties prop = new Properties();
36
prop.load(new FileInputStream(new File(Environment.getRootDirectory(), "build.prop")));
37
if (Build.MANUFACTURER.toLowerCase().equals("xiaomi")//官方提供的判断是否为小米手机(而非MIUI系统)的方法
38
|| prop.getProperty(KEY_MIUI_VERSION_NAME, null) != null//QMUI提供的判断是否是MIUI的方法
39
|| prop.getProperty(KEY_MIUI_VERSION_CODE, null) != null//下面两个是网上补充的方法,感觉没必要的
40
|| prop.getProperty(KEY_MIUI_INTERNAL_STORAGE, null) != null) {
41
return SystemType.SYS_MIUI;
42
} else if (isEMUI()//华为
43
|| prop.getProperty(KEY_EMUI_API_LEVEL, null) != null
44
|| prop.getProperty(KEY_EMUI_VERSION, null) != null
45
|| prop.getProperty(KEY_EMUI_CONFIG_HW_SYS_VERSION, null) != null) {
46
return SystemType.SYS_EMUI;
47
} else if (isMeizu()//魅族推送SDK中提供的判断是否是魅族的方法
48
|| DeviceHelper.isMeizu()) {//QMUI提供的判断是否是魅族的方法
49
return SystemType.SYS_FLYME;
50
}
51
} catch (IOException e) {
52
e.printStackTrace();
53
}
54
return SystemType.SYS_OTHER;
55
}
56
57
@SuppressLint("PrivateApi")
58
private static boolean isEMUI() {
59
Class<?>[] clsArray = new Class<?>[]{String.class};
60
Object[] objArray = new Object[]{"ro.build.version.emui"};
61
try {
62
Class<?> SystemPropertiesClass = Class.forName("android.os.SystemProperties");
63
Method get = SystemPropertiesClass.getDeclaredMethod("get", clsArray);
64
String version = (String) get.invoke(SystemPropertiesClass, objArray);
65
Log.i("bqt", "EMUI version is:" + version);
66
return !TextUtils.isEmpty(version);
67
} catch (Exception e) {
68
e.printStackTrace();
69
}
70
return false;
71
}
72
73
/**
74
* 判断是否为魅族设备
75
*/
76
private static boolean isMeizu() {
77
String model = SystemProperties.get("ro.meizu.product.model");
78
return (!TextUtils.isEmpty(model)) || "meizu".equalsIgnoreCase(Build.BRAND) || "22c4185e".equalsIgnoreCase(Build.BRAND);
79
}
80
}
QMUI库中提供的方法
//判断系统厂商,里面的内容基本都来自QMUI库public class DeviceHelper {private final static String KEY_MIUI_VERSION_NAME = "ro.miui.ui.version.name";private static final String KEY_FLYME_VERSION_NAME = "ro.build.display.id";private final static String FLYME = "flyme";private final static String MEIZUBOARD[] = {"m9", "M9", "mx", "MX"};private static String sMiuiVersionName;private static String sFlymeVersionName;static {Properties properties = new Properties();if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {// android 8.0,读取 /system/build.prop 会报 permission deniedFileInputStream fileInputStream = null;try {fileInputStream = new FileInputStream(new File(Environment.getRootDirectory(), "build.prop"));properties.load(fileInputStream);} catch (Exception e) {e.printStackTrace();} finally {if (fileInputStream != null) {try {fileInputStream.close();} catch (IOException e) {e.printStackTrace();}}}}try {Class<?> clzSystemProperties = Class.forName("android.os.SystemProperties");Method getMethod = clzSystemProperties.getDeclaredMethod("get", String.class);sMiuiVersionName = getLowerCaseName(properties, getMethod, KEY_MIUI_VERSION_NAME);sFlymeVersionName = getLowerCaseName(properties, getMethod, KEY_FLYME_VERSION_NAME);} catch (Exception e) {e.printStackTrace();}}private static String getLowerCaseName(Properties p, Method get, String key) {String name = p.getProperty(key);if (name == null) {try {name = (String) get.invoke(null, key);} catch (Exception e) {e.printStackTrace();}}if (name != null) name = name.toLowerCase();return name;}private static boolean sIsTabletChecked = false;private static boolean sIsTabletValue = false;/*** 判断是否为平板设备*/public static boolean isTablet(Context context) {if (sIsTabletChecked) {return sIsTabletValue;} else {sIsTabletChecked = true;sIsTabletValue = (context.getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) >=Configuration.SCREENLAYOUT_SIZE_LARGE;return sIsTabletValue;}}/*** 判断是否是flyme系统*/public static boolean isFlyme() {return !TextUtils.isEmpty(sFlymeVersionName) && sFlymeVersionName.contains(FLYME);}/*** 判断是否是MIUI系统*/public static boolean isMIUI() {return !TextUtils.isEmpty(sMiuiVersionName);}public static boolean isMIUIV5() {return "v5".equals(sMiuiVersionName);}public static boolean isMIUIV6() {return "v6".equals(sMiuiVersionName);}public static boolean isMIUIV7() {return "v7".equals(sMiuiVersionName);}public static boolean isMIUIV8() {return "v8".equals(sMiuiVersionName);}public static boolean isMIUIV9() {return "v9".equals(sMiuiVersionName);}public static boolean isFlymeVersionHigher5_2_4() {//查不到默认高于5.2.4boolean isHigher = true;if (sFlymeVersionName != null && !sFlymeVersionName.equals("")) {Pattern pattern = pile("(\\d+\\.){2}\\d");Matcher matcher = pattern.matcher(sFlymeVersionName);if (matcher.find()) {String versionString = matcher.group();if (versionString != null && !versionString.equals("")) {String[] version = versionString.split("\\.");if (version.length == 3) {if (Integer.valueOf(version[0]) < 5) {isHigher = false;} else if (Integer.valueOf(version[0]) > 5) {isHigher = true;} else {if (Integer.valueOf(version[1]) < 2) {isHigher = false;} else if (Integer.valueOf(version[1]) > 2) {isHigher = true;} else {if (Integer.valueOf(version[2]) < 4) {isHigher = false;} else if (Integer.valueOf(version[2]) >= 5) {isHigher = true;}}}}}}}return isMeizu() && isHigher;}/*** 判断是否为魅族*/public static boolean isMeizu() {return isSpecialBoardPhone(MEIZUBOARD) || isFlyme();}/*** 判断是否为小米,详见/doc/?p=254*/public static boolean isXiaomi() {return Build.MANUFACTURER.toLowerCase().equals("xiaomi");}/*** 是否是指定型号的手机*/private static boolean isSpecialBoardPhone(String[] boards) {String board = android.os.Build.BOARD;if (board != null) {for (String b : boards) {if (board.equals(b)) {return true;}}}return false;}}
1691
//判断系统厂商,里面的内容基本都来自QMUI库
2
public class DeviceHelper {
3
private final static String KEY_MIUI_VERSION_NAME = "ro.miui.ui.version.name";
4
private static final String KEY_FLYME_VERSION_NAME = "ro.build.display.id";
5
private final static String FLYME = "flyme";
6
private final static String MEIZUBOARD[] = {"m9", "M9", "mx", "MX"};
7
private static String sMiuiVersionName;
8
private static String sFlymeVersionName;
9
10
static {
11
Properties properties = new Properties();
12
13
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {// android 8.0,读取 /system/build.prop 会报 permission denied
14
FileInputStream fileInputStream = null;
15
try {
16
fileInputStream = new FileInputStream(new File(Environment.getRootDirectory(), "build.prop"));
17
properties.load(fileInputStream);
18
} catch (Exception e) {
19
e.printStackTrace();
20
} finally {
21
if (fileInputStream != null) {
22
try {
23
fileInputStream.close();
24
} catch (IOException e) {
25
e.printStackTrace();
26
}
27
}
28
}
29
}
30
31
try {
32
Class<?> clzSystemProperties = Class.forName("android.os.SystemProperties");
33
Method getMethod = clzSystemProperties.getDeclaredMethod("get", String.class);
34
sMiuiVersionName = getLowerCaseName(properties, getMethod, KEY_MIUI_VERSION_NAME);
35
sFlymeVersionName = getLowerCaseName(properties, getMethod, KEY_FLYME_VERSION_NAME);
36
} catch (Exception e) {
37
e.printStackTrace();
38
}
39
}
40
41
private static String getLowerCaseName(Properties p, Method get, String key) {
42
String name = p.getProperty(key);
43
if (name == null) {
44
try {
45
name = (String) get.invoke(null, key);
46
} catch (Exception e) {
47
e.printStackTrace();
48
}
49
}
50
if (name != null) name = name.toLowerCase();
51
return name;
52
}
53
54
private static boolean sIsTabletChecked = false;
55
private static boolean sIsTabletValue = false;
56
57
/**
58
* 判断是否为平板设备
59
*/
60
public static boolean isTablet(Context context) {
61
if (sIsTabletChecked) {
62
return sIsTabletValue;
63
} else {
64
sIsTabletChecked = true;
65
sIsTabletValue = (context.getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) >=
66
Configuration.SCREENLAYOUT_SIZE_LARGE;
67
return sIsTabletValue;
68
}
69
}
70
71
/**
72
* 判断是否是flyme系统
73
*/
74
public static boolean isFlyme() {
75
return !TextUtils.isEmpty(sFlymeVersionName) && sFlymeVersionName.contains(FLYME);
76
}
77
78
/**
79
* 判断是否是MIUI系统
80
*/
81
public static boolean isMIUI() {
82
return !TextUtils.isEmpty(sMiuiVersionName);
83
}
84
85
public static boolean isMIUIV5() {
86
return "v5".equals(sMiuiVersionName);
87
}
88
89
public static boolean isMIUIV6() {
90
return "v6".equals(sMiuiVersionName);
91
}
92
93
public static boolean isMIUIV7() {
94
return "v7".equals(sMiuiVersionName);
95
}
96
97
public static boolean isMIUIV8() {
98
return "v8".equals(sMiuiVersionName);
99
}
100
101
public static boolean isMIUIV9() {
102
return "v9".equals(sMiuiVersionName);
103
}
104
105
public static boolean isFlymeVersionHigher5_2_4() {
106
//查不到默认高于5.2.4
107
boolean isHigher = true;
108
if (sFlymeVersionName != null && !sFlymeVersionName.equals("")) {
109
Pattern pattern = pile("(\\d+\\.){2}\\d");
110
Matcher matcher = pattern.matcher(sFlymeVersionName);
111
if (matcher.find()) {
112
String versionString = matcher.group();
113
if (versionString != null && !versionString.equals("")) {
114
String[] version = versionString.split("\\.");
115
if (version.length == 3) {
116
if (Integer.valueOf(version[0]) < 5) {
117
isHigher = false;
118
} else if (Integer.valueOf(version[0]) > 5) {
119
isHigher = true;
120
} else {
121
if (Integer.valueOf(version[1]) < 2) {
122
isHigher = false;
123
} else if (Integer.valueOf(version[1]) > 2) {
124
isHigher = true;
125
} else {
126
if (Integer.valueOf(version[2]) < 4) {
127
isHigher = false;
128
} else if (Integer.valueOf(version[2]) >= 5) {
129
isHigher = true;
130
}
131
}
132
}
133
}
134
135
}
136
}
137
}
138
return isMeizu() && isHigher;
139
}
140
141
/**
142
* 判断是否为魅族
143
*/
144
public static boolean isMeizu() {
145
return isSpecialBoardPhone(MEIZUBOARD) || isFlyme();
146
}
147
148
/**
149
* 判断是否为小米,详见/doc/?p=254
150
*/
151
public static boolean isXiaomi() {
152
return Build.MANUFACTURER.toLowerCase().equals("xiaomi");
153
}
154
155
/**
156
* 是否是指定型号的手机
157
*/
158
private static boolean isSpecialBoardPhone(String[] boards) {
159
String board = android.os.Build.BOARD;
160
if (board != null) {
161
for (String b : boards) {
162
if (board.equals(b)) {
163
return true;
164
}
165
}
166
}
167
return false;
168
}
169
}
-4-20