由于 Android 机型繁多,存在着各种定制的ROM,所以在开发应用的过程中,时常需要针对不同的ROM进行适配。
对于深度定制的ROM通常检查/system/build.prop
文件中的某些自定义字段(比如ROM版本名)是否存在来判断ROM类型。
对于未深度定制的系统,可能没有明显的自定义字段,这时直接用 Build.MANUFACTURER
来判断。
代码如下
- 检查是否某类型ROM
RomUtil.isXXX()
,RomUtil.check(romName)
- 获取 ROM 名称
RomUtil.getName()
- 获取 ROM 版本名
RomUtil.getVersion()
public class RomUtil {
private static final String TAG = "RomUtil";
public static final String ROM_MIUI = "MIUI";
public static final String ROM_EMUI = "EMUI";
public static final String ROM_FLYME = "FLYME";
public static final String ROM_OPPO = "OPPO";
public static final String ROM_SMARTISAN = "SMARTISAN";
public static final String ROM_VIVO = "VIVO";
public static final String ROM_QIHU = "QIHU";
public static final String ROM_LENOVO = "LENOVO";
public static final String ROM_SAMSUNG = "SAMSUNG";
private static final String KEY_VERSION_MIUI = "ro.miui.ui.version.name";
private static final String KEY_VERSION_EMUI = "ro.build.version.emui";
private static final String KEY_VERSION_OPPO = "ro.build.version.opporom";
private static final String KEY_VERSION_SMARTISAN = "ro.smartisan.version";
private static final String KEY_VERSION_VIVO = "ro.vivo.os.version";
private static final String KEY_VERSION_GIONEE = "ro.gn.sv.version";
private static final String KEY_VERSION_LENOVO = "ro.lenovo.lvp.version";
public static boolean isEmui() {
return check(ROM_EMUI);
}
public static boolean isMiui() {
return check(ROM_MIUI);
}
public static boolean isVivo() {
return check(ROM_VIVO);
}
public static boolean isOppo() {
return check(ROM_OPPO);
}
public static boolean isFlyme() {
return check(ROM_FLYME);
}
public static boolean isQihu() {
return check(ROM_QIHU);
}
public static boolean isSmartisan() {
return check(ROM_SMARTISAN);
}
private static String sName;
public static String getName() {
if (sName == null) {
check("");
}
return sName;
}
private static String sVersion;
public static String getVersion() {
if (sVersion == null) {
check("");
}
return sVersion;
}
public static boolean check(String rom) {
if (sName != null) {
return sName.equals(rom);
}
if (!TextUtils.isEmpty(sVersion = getProp(KEY_VERSION_MIUI))) {
sName = ROM_MIUI;
} else if (!TextUtils.isEmpty(sVersion = getProp(KEY_VERSION_EMUI))){
sName = ROM_EMUI;
} else if (!TextUtils.isEmpty(sVersion = getProp(KEY_VERSION_OPPO))){
sName = ROM_OPPO;
} else if (!TextUtils.isEmpty(sVersion = getProp(KEY_VERSION_VIVO))){
sName = ROM_VIVO;
} else if (!TextUtils.isEmpty(sVersion = getProp(KEY_VERSION_SMARTISAN))){
sName = ROM_SMARTISAN;
} else {
sVersion = Build.DISPLAY;
if (sVersion.toUpperCase().contains(ROM_FLYME)) {
sName = ROM_FLYME;
} else {
sVersion = Build.UNKNOWN;
sName = Build.MANUFACTURER.toUpperCase();
}
}
return sName.equals(rom);
}
public static String getProp(String name) {
String line = null;
BufferedReader input = null;
try {
Process p = Runtime.getRuntime().exec("getprop " + name);
input = new BufferedReader(new InputStreamReader(p.getInputStream()), 1024);
line = input.readLine();
input.close();
} catch (IOException ex) {
Log.e(TAG, "Unable to read prop " + name, ex);
return null;
} finally {
if (input != null) {
try {
input.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return line;
}
// private static Properties props = new Properties();
// static {
// try {
// props.load(new FileInputStream(new File("/system/build.prop")));
// } catch (IOException e) {
//
// }
// }
// public static String getProp(String name) {
// return props.getProperty(name, Build.UNKNOWN);
// }
}