package com.example.tidalairpeisong.utils; import android.os.Environment; import android.text.TextUtils; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.util.Properties; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * @ClassName OSUtils * @Antuor Administrator * @Date 2021/10/12 * @Version 1.0 * desc : 工具类: OS 系统相关 * 简介 : 由于国内定制系统的泛滥, 不同定制系统的一些功能或实现方法会有所不同, 如果需要做到足够好的适配工作, 需要 * 对不同的定制系统做一些专门的适配. * API : 获取 ROM 类型等 * * Deprecated : * 在工具类中对 ROM 类型进行判断,显得有些力不从心,所以单独创建了新的项目,用于判断 ROM,获取其版本号。 */ public class OSUtils { private static final String KEY_DISPLAY_ID = "ro.build.display.id"; private static final String KEY_BASE_OS_VERSION = "ro.build.version.base_os"; private static final String KEY_CLIENT_ID_BASE = "ro.com.google.clientidbase"; // 小米 : MIUI private static final String KEY_MIUI_VERSION = "ro.build.version.incremental"; // "7.6.15" private static final String KEY_MIUI_VERSION_NANE = "ro.miui.ui.version.name"; // "V8" private static final String KEY_MIUI_VERSION_CODE = "ro.miui.ui.version.code"; // "6" private static final String VALUE_MIUI_CLIENT_ID_BASE = "android-xiaomi"; // 华为 : EMUI private static final String KEY_EMUI_VERSION = "ro.build.version.emui"; // "EmotionUI_3.0" private static final String KEY_EMUI_API_LEVEL = "ro.build.hw_emui_api_level"; // private static final String KEY_EMUI_SYSTEM_VERSION = "ro.confg.hw_systemversion"; // // "T1-A21wV100R001C233B008_SYSIMG" // 魅族 : Flyme private static final String KEY_FLYME_PUBLISHED = "ro.flyme.published"; // "true" private static final String KEY_FLYME_SETUP = "ro.meizu.setupwizard.flyme"; // "true" private static final String VALUE_FLYME_DISPLAY_ID_CONTAIN = "Flyme"; // "Flyme OS 4.5.4.2U" // OPPO : ColorOS private static final String KEY_COLOROS_VERSION = "ro.oppo.theme.version"; // "703" private static final String KEY_COLOROS_THEME_VERSION = "ro.oppo.version"; // "" private static final String KEY_COLOROS_ROM_VERSION = "ro.rom.different.version"; // private static final String VALUE_COLOROS_BASE_OS_VERSION_CONTAIN = "OPPO"; // "OPPO/R7sm // "ColorOS2.1" // /R7sm:5.1.1/LMY47V/1440928800:user/release-keys" private static final String VALUE_COLOROS_CLIENT_ID_BASE = "android-oppo"; // vivo : FuntouchOS private static final String KEY_FUNTOUCHOS_BOARD_VERSION = "ro.vivo.board.version"; // "MD" private static final String KEY_FUNTOUCHOS_OS_NAME = "ro.vivo.os.name"; // "Funtouch" private static final String KEY_FUNTOUCHOS_OS_VERSION = "ro.vivo.os.version"; // "3.0" private static final String KEY_FUNTOUCHOS_DISPLAY_ID = "ro.vivo.os.build.display.id"; // // "FuntouchOS_3.0" private static final String KEY_FUNTOUCHOS_ROM_VERSION = "ro.vivo.rom.version"; // "rom_3.1" private static final String VALUE_FUNTOUCHOS_CLIENT_ID_BASE = "android-vivo"; // Samsung private static final String VALUE_SAMSUNG_BASE_OS_VERSION_CONTAIN = "samsung"; // "samsung // /zeroltezc/zeroltechn:6.0.1/MMB29K/G9250ZCU2DQD1:user/release-keys" private static final String VALUE_SAMSUNG_CLIENT_ID_BASE = "android-samsung"; // Sony private static final String KEY_SONY_PROTOCOL_TYPE = "ro.sony.irremote.protocol_type"; // "2" private static final String KEY_SONY_ENCRYPTED_DATA = "ro.sony.fota.encrypteddata"; // private static final String VALUE_SONY_CLIENT_ID_BASE = "android-sonyericsson"; // "supported" // 乐视 : eui private static final String KEY_EUI_VERSION = "ro.letv.release.version"; // "5.9.023S" private static final String KEY_EUI_VERSION_DATE = "ro.letv.release.version_date"; // "5.9 // .023S_03111" private static final String KEY_EUI_NAME = "ro.product.letv_name"; // "乐1s" private static final String KEY_EUI_MODEL = "ro.product.letv_model"; // "Letv X500" // 金立 : amigo private static final String KEY_AMIGO_ROM_VERSION = "ro.gn.gnromvernumber"; // "GIONEE ROM5.0 // .16" private static final String KEY_AMIGO_SYSTEM_UI_SUPPORT = "ro.gn.amigo.systemui.support"; // private static final String VALUE_AMIGO_DISPLAY_ID_CONTAIN = "amigo"; // "amigo3.5.1" // "yes" private static final String VALUE_AMIGO_CLIENT_ID_BASE = "android-gionee"; // 酷派 : yulong private static final String KEY_YULONG_VERSION_RELEASE = "ro.yulong.version.release"; // "5.1 // .046.P1.150921.8676_M01" private static final String KEY_YULONG_VERSION_TAG = "ro.yulong.version.tag"; // "LC" private static final String VALUE_YULONG_CLIENT_ID_BASE = "android-coolpad"; // HTC : Sense private static final String KEY_SENSE_BUILD_STAGE = "htc.build.stage"; // "2" private static final String KEY_SENSE_BLUETOOTH_SAP = "ro.htc.bluetooth.sap"; // "true" private static final String VALUE_SENSE_CLIENT_ID_BASE = "android-htc-rev"; // LG : LG private static final String KEY_LG_SW_VERSION = "ro.lge.swversion"; // "D85720b" private static final String KEY_LG_SW_VERSION_SHORT = "ro.lge.swversion_short"; // "V20b" private static final String KEY_LG_FACTORY_VERSION = "ro.lge.factoryversion"; // "LGD857AT-00 // -V20b-CUO-CN-FEB-17-2015+0" // 联想 private static final String KEY_LENOVO_DEVICE = "ro.lenovo.device"; // "phone" private static final String KEY_LENOVO_PLATFORM = "ro.lenovo.platform"; // "qualcomm" private static final String KEY_LENOVO_ADB = "ro.lenovo.adb"; // "apkctl,speedup" private static final String VALUE_LENOVO_CLIENT_ID_BASE = "android-lenovo"; /** * ROM 类型 */ private static final ROM ROM_TYPE = initRomType(); /** * 获取 ROM 类型 * * @return ROM */ public static ROM getRomType() { return ROM_TYPE; } /** * 初始化 ROM 类型 */ private static ROM initRomType() { ROM rom = ROM.Other; FileInputStream is = null; try { Properties buildProperties = new Properties(); is = new FileInputStream(new File(Environment.getRootDirectory(), "build.prop")); buildProperties.load(is); if (buildProperties.containsKey(KEY_MIUI_VERSION_NANE) || buildProperties.containsKey(KEY_MIUI_VERSION_CODE)) { // MIUI rom = ROM.MIUI; if (buildProperties.containsKey(KEY_MIUI_VERSION_NANE)) { String versionName = buildProperties.getProperty(KEY_MIUI_VERSION_NANE); if (!TextUtils.isEmpty(versionName) && versionName.matches("[Vv]\\d+")) { // V8 try { rom.setBaseVersion(Integer.parseInt(versionName.split("[Vv]")[1])); } catch (Exception e) { e.printStackTrace(); } } } if (buildProperties.containsKey(KEY_MIUI_VERSION)) { String versionStr = buildProperties.getProperty(KEY_MIUI_VERSION); if (!TextUtils.isEmpty(versionStr) && versionStr.matches("[\\d.]+")) { rom.setVersion(versionStr); } } } else if (buildProperties.containsKey(KEY_EMUI_VERSION) || buildProperties.containsKey(KEY_EMUI_API_LEVEL) || buildProperties.containsKey(KEY_EMUI_SYSTEM_VERSION)) { // EMUI rom = ROM.EMUI; if (buildProperties.containsKey(KEY_EMUI_VERSION)) { String versionStr = buildProperties.getProperty(KEY_EMUI_VERSION); Matcher matcher = Pattern.compile("EmotionUI_([\\d.]+)").matcher(versionStr); // EmotionUI_3.0 if (!TextUtils.isEmpty(versionStr) && matcher.find()) { try { String version = matcher.group(1); rom.setVersion(version); rom.setBaseVersion(Integer.parseInt(version.split("\\.")[0])); } catch (Exception e) { e.printStackTrace(); } } } } else if (buildProperties.containsKey(KEY_FLYME_SETUP) || buildProperties.containsKey(KEY_FLYME_PUBLISHED)) { // Flyme rom = ROM.Flyme; if (buildProperties.containsKey(KEY_DISPLAY_ID)) { String versionStr = buildProperties.getProperty(KEY_DISPLAY_ID); Matcher matcher = Pattern.compile("Flyme[^\\d]*([\\d.]+)[^\\d]*").matcher(versionStr); // Flyme OS 4.5.4.2U if (!TextUtils.isEmpty(versionStr) && matcher.find()) { try { String version = matcher.group(1); rom.setVersion(version); rom.setBaseVersion(Integer.parseInt(version.split("\\.")[0])); } catch (Exception e) { e.printStackTrace(); } } } } else if (buildProperties.containsKey(KEY_COLOROS_VERSION) || buildProperties.containsKey(KEY_COLOROS_THEME_VERSION) || buildProperties.containsKey(KEY_COLOROS_ROM_VERSION)) { // ColorOS rom = ROM.ColorOS; if (buildProperties.containsKey(KEY_COLOROS_ROM_VERSION)) { String versionStr = buildProperties.getProperty(KEY_COLOROS_ROM_VERSION); Matcher matcher = Pattern.compile("ColorOS([\\d.]+)").matcher(versionStr); // // ColorOS2.1 if (!TextUtils.isEmpty(versionStr) && matcher.find()) { try { String version = matcher.group(1); rom.setVersion(version); rom.setBaseVersion(Integer.parseInt(version.split("\\.")[0])); } catch (Exception e) { e.printStackTrace(); } } } } else if (buildProperties.containsKey(KEY_FUNTOUCHOS_OS_NAME) || buildProperties.containsKey(KEY_FUNTOUCHOS_OS_VERSION) || buildProperties.containsKey(KEY_FUNTOUCHOS_DISPLAY_ID)) { // FuntouchOS rom = ROM.FuntouchOS; if (buildProperties.containsKey(KEY_FUNTOUCHOS_OS_VERSION)) { String versionStr = buildProperties.getProperty(KEY_FUNTOUCHOS_OS_VERSION); if (!TextUtils.isEmpty(versionStr) && versionStr.matches("[\\d.]+")) { // 3.0 try { rom.setVersion(versionStr); rom.setBaseVersion(Integer.parseInt(versionStr.split("\\.")[0])); } catch (Exception e) { e.printStackTrace(); } } } } else if (buildProperties.containsKey(KEY_EUI_VERSION) || buildProperties.containsKey(KEY_EUI_NAME) || buildProperties.containsKey(KEY_EUI_MODEL)) { // EUI rom = ROM.EUI; if (buildProperties.containsKey(KEY_EUI_VERSION)) { String versionStr = buildProperties.getProperty(KEY_EUI_VERSION); Matcher matcher = Pattern.compile("([\\d.]+)[^\\d]*").matcher(versionStr); // // 5.9.023S if (!TextUtils.isEmpty(versionStr) && matcher.find()) { try { String version = matcher.group(1); rom.setVersion(version); rom.setBaseVersion(Integer.parseInt(version.split("\\.")[0])); } catch (Exception e) { e.printStackTrace(); } } } } else if (buildProperties.containsKey(KEY_AMIGO_ROM_VERSION) || buildProperties.containsKey(KEY_AMIGO_SYSTEM_UI_SUPPORT)) { // amigo rom = ROM.AmigoOS; if (buildProperties.containsKey(KEY_DISPLAY_ID)) { String versionStr = buildProperties.getProperty(KEY_DISPLAY_ID); Matcher matcher = Pattern.compile("amigo([\\d.]+)[a-zA-Z]*").matcher(versionStr); // // "amigo3.5.1" if (!TextUtils.isEmpty(versionStr) && matcher.find()) { try { String version = matcher.group(1); rom.setVersion(version); rom.setBaseVersion(Integer.parseInt(version.split("\\.")[0])); } catch (Exception e) { e.printStackTrace(); } } } } else if (buildProperties.containsKey(KEY_SONY_PROTOCOL_TYPE) || buildProperties.containsKey(KEY_SONY_ENCRYPTED_DATA)) { // Sony rom = ROM.Sony; } else if (buildProperties.containsKey(KEY_YULONG_VERSION_RELEASE) || buildProperties.containsKey(KEY_YULONG_VERSION_TAG)) { // YuLong rom = ROM.YuLong; } else if (buildProperties.containsKey(KEY_SENSE_BUILD_STAGE) || buildProperties.containsKey(KEY_SENSE_BLUETOOTH_SAP)) { // Sense rom = ROM.Sense; } else if (buildProperties.containsKey(KEY_LG_SW_VERSION) || buildProperties.containsKey(KEY_LG_SW_VERSION_SHORT) || buildProperties.containsKey(KEY_LG_FACTORY_VERSION)) { // LG rom = ROM.LG; } else if (buildProperties.containsKey(KEY_LENOVO_DEVICE) || buildProperties.containsKey(KEY_LENOVO_PLATFORM) || buildProperties.containsKey(KEY_LENOVO_ADB)) { // Lenovo rom = ROM.Lenovo; } else if (buildProperties.containsKey(KEY_DISPLAY_ID)) { String displayId = buildProperties.getProperty(KEY_DISPLAY_ID); if (!TextUtils.isEmpty(displayId)) { if (displayId.contains(VALUE_FLYME_DISPLAY_ID_CONTAIN)) { return ROM.Flyme; } else if (displayId.contains(VALUE_AMIGO_DISPLAY_ID_CONTAIN)) { return ROM.AmigoOS; } } } else if (buildProperties.containsKey(KEY_BASE_OS_VERSION)) { String baseOsVersion = buildProperties.getProperty(KEY_BASE_OS_VERSION); if (!TextUtils.isEmpty(baseOsVersion)) { if (baseOsVersion.contains(VALUE_COLOROS_BASE_OS_VERSION_CONTAIN)) { return ROM.ColorOS; } else if (baseOsVersion.contains(VALUE_SAMSUNG_BASE_OS_VERSION_CONTAIN)) { return ROM.SamSung; } } } else if (buildProperties.containsKey(KEY_CLIENT_ID_BASE)) { String clientIdBase = buildProperties.getProperty(KEY_CLIENT_ID_BASE); switch (clientIdBase) { case VALUE_MIUI_CLIENT_ID_BASE: return ROM.MIUI; case VALUE_COLOROS_CLIENT_ID_BASE: return ROM.ColorOS; case VALUE_FUNTOUCHOS_CLIENT_ID_BASE: return ROM.FuntouchOS; case VALUE_SAMSUNG_CLIENT_ID_BASE: return ROM.SamSung; case VALUE_SONY_CLIENT_ID_BASE: return ROM.Sony; case VALUE_YULONG_CLIENT_ID_BASE: return ROM.YuLong; case VALUE_SENSE_CLIENT_ID_BASE: return ROM.Sense; case VALUE_LENOVO_CLIENT_ID_BASE: return ROM.Lenovo; case VALUE_AMIGO_CLIENT_ID_BASE: return ROM.AmigoOS; default: break; } } } catch (IOException e) { e.printStackTrace(); } finally { if (is != null) { try { is.close(); } catch (IOException e) { e.printStackTrace(); } } } return rom; } public enum ROM { MIUI, // 小米 Flyme, // 魅族 EMUI, // 华为 ColorOS, // OPPO FuntouchOS, // vivo SmartisanOS, // 锤子 EUI, // 乐视 Sense, // HTC AmigoOS, // 金立 _360OS, // 奇酷360 NubiaUI, // 努比亚 H2OS, // 一加 YunOS, // 阿里巴巴 YuLong, // 酷派 SamSung, // 三星 Sony, // 索尼 Lenovo, // 联想 LG, // LG Google, // 原生 Other; // CyanogenMod, Lewa OS, 百度云OS, Tencent OS, 深度OS, IUNI OS, Tapas OS, Mokee private int baseVersion = -1; private String version; public int getBaseVersion() { return baseVersion; } void setBaseVersion(int baseVersion) { this.baseVersion = baseVersion; } public String getVersion() { return version; } void setVersion(String version) { this.version = version; } } }