You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

369 lines
18KB

  1. package com.example.tidalairpeisong.utils;
  2. import android.os.Environment;
  3. import android.text.TextUtils;
  4. import java.io.File;
  5. import java.io.FileInputStream;
  6. import java.io.IOException;
  7. import java.util.Properties;
  8. import java.util.regex.Matcher;
  9. import java.util.regex.Pattern;
  10. /**
  11. * @ClassName OSUtils
  12. * @Antuor Administrator
  13. * @Date 2021/10/12
  14. * @Version 1.0
  15. * desc : 工具类: OS 系统相关
  16. * 简介 : 由于国内定制系统的泛滥, 不同定制系统的一些功能或实现方法会有所不同, 如果需要做到足够好的适配工作, 需要
  17. * 对不同的定制系统做一些专门的适配.
  18. * API : 获取 ROM 类型等
  19. *
  20. * Deprecated :
  21. * 在工具类中对 ROM 类型进行判断,显得有些力不从心,所以单独创建了新的项目,用于判断 ROM,获取其版本号。
  22. */
  23. public class OSUtils {
  24. private static final String KEY_DISPLAY_ID = "ro.build.display.id";
  25. private static final String KEY_BASE_OS_VERSION = "ro.build.version.base_os";
  26. private static final String KEY_CLIENT_ID_BASE = "ro.com.google.clientidbase";
  27. // 小米 : MIUI
  28. private static final String KEY_MIUI_VERSION = "ro.build.version.incremental"; // "7.6.15"
  29. private static final String KEY_MIUI_VERSION_NANE = "ro.miui.ui.version.name"; // "V8"
  30. private static final String KEY_MIUI_VERSION_CODE = "ro.miui.ui.version.code"; // "6"
  31. private static final String VALUE_MIUI_CLIENT_ID_BASE = "android-xiaomi";
  32. // 华为 : EMUI
  33. private static final String KEY_EMUI_VERSION = "ro.build.version.emui"; // "EmotionUI_3.0"
  34. private static final String KEY_EMUI_API_LEVEL = "ro.build.hw_emui_api_level"; //
  35. private static final String KEY_EMUI_SYSTEM_VERSION = "ro.confg.hw_systemversion"; //
  36. // "T1-A21wV100R001C233B008_SYSIMG"
  37. // 魅族 : Flyme
  38. private static final String KEY_FLYME_PUBLISHED = "ro.flyme.published"; // "true"
  39. private static final String KEY_FLYME_SETUP = "ro.meizu.setupwizard.flyme"; // "true"
  40. private static final String VALUE_FLYME_DISPLAY_ID_CONTAIN = "Flyme"; // "Flyme OS 4.5.4.2U"
  41. // OPPO : ColorOS
  42. private static final String KEY_COLOROS_VERSION = "ro.oppo.theme.version"; // "703"
  43. private static final String KEY_COLOROS_THEME_VERSION = "ro.oppo.version"; // ""
  44. private static final String KEY_COLOROS_ROM_VERSION = "ro.rom.different.version"; //
  45. private static final String VALUE_COLOROS_BASE_OS_VERSION_CONTAIN = "OPPO"; // "OPPO/R7sm
  46. // "ColorOS2.1"
  47. // /R7sm:5.1.1/LMY47V/1440928800:user/release-keys"
  48. private static final String VALUE_COLOROS_CLIENT_ID_BASE = "android-oppo";
  49. // vivo : FuntouchOS
  50. private static final String KEY_FUNTOUCHOS_BOARD_VERSION = "ro.vivo.board.version"; // "MD"
  51. private static final String KEY_FUNTOUCHOS_OS_NAME = "ro.vivo.os.name"; // "Funtouch"
  52. private static final String KEY_FUNTOUCHOS_OS_VERSION = "ro.vivo.os.version"; // "3.0"
  53. private static final String KEY_FUNTOUCHOS_DISPLAY_ID = "ro.vivo.os.build.display.id"; //
  54. // "FuntouchOS_3.0"
  55. private static final String KEY_FUNTOUCHOS_ROM_VERSION = "ro.vivo.rom.version"; // "rom_3.1"
  56. private static final String VALUE_FUNTOUCHOS_CLIENT_ID_BASE = "android-vivo";
  57. // Samsung
  58. private static final String VALUE_SAMSUNG_BASE_OS_VERSION_CONTAIN = "samsung"; // "samsung
  59. // /zeroltezc/zeroltechn:6.0.1/MMB29K/G9250ZCU2DQD1:user/release-keys"
  60. private static final String VALUE_SAMSUNG_CLIENT_ID_BASE = "android-samsung";
  61. // Sony
  62. private static final String KEY_SONY_PROTOCOL_TYPE = "ro.sony.irremote.protocol_type"; // "2"
  63. private static final String KEY_SONY_ENCRYPTED_DATA = "ro.sony.fota.encrypteddata"; //
  64. private static final String VALUE_SONY_CLIENT_ID_BASE = "android-sonyericsson";
  65. // "supported"
  66. // 乐视 : eui
  67. private static final String KEY_EUI_VERSION = "ro.letv.release.version"; // "5.9.023S"
  68. private static final String KEY_EUI_VERSION_DATE = "ro.letv.release.version_date"; // "5.9
  69. // .023S_03111"
  70. private static final String KEY_EUI_NAME = "ro.product.letv_name"; // "乐1s"
  71. private static final String KEY_EUI_MODEL = "ro.product.letv_model"; // "Letv X500"
  72. // 金立 : amigo
  73. private static final String KEY_AMIGO_ROM_VERSION = "ro.gn.gnromvernumber"; // "GIONEE ROM5.0
  74. // .16"
  75. private static final String KEY_AMIGO_SYSTEM_UI_SUPPORT = "ro.gn.amigo.systemui.support"; //
  76. private static final String VALUE_AMIGO_DISPLAY_ID_CONTAIN = "amigo"; // "amigo3.5.1"
  77. // "yes"
  78. private static final String VALUE_AMIGO_CLIENT_ID_BASE = "android-gionee";
  79. // 酷派 : yulong
  80. private static final String KEY_YULONG_VERSION_RELEASE = "ro.yulong.version.release"; // "5.1
  81. // .046.P1.150921.8676_M01"
  82. private static final String KEY_YULONG_VERSION_TAG = "ro.yulong.version.tag"; // "LC"
  83. private static final String VALUE_YULONG_CLIENT_ID_BASE = "android-coolpad";
  84. // HTC : Sense
  85. private static final String KEY_SENSE_BUILD_STAGE = "htc.build.stage"; // "2"
  86. private static final String KEY_SENSE_BLUETOOTH_SAP = "ro.htc.bluetooth.sap"; // "true"
  87. private static final String VALUE_SENSE_CLIENT_ID_BASE = "android-htc-rev";
  88. // LG : LG
  89. private static final String KEY_LG_SW_VERSION = "ro.lge.swversion"; // "D85720b"
  90. private static final String KEY_LG_SW_VERSION_SHORT = "ro.lge.swversion_short"; // "V20b"
  91. private static final String KEY_LG_FACTORY_VERSION = "ro.lge.factoryversion"; // "LGD857AT-00
  92. // -V20b-CUO-CN-FEB-17-2015+0"
  93. // 联想
  94. private static final String KEY_LENOVO_DEVICE = "ro.lenovo.device"; // "phone"
  95. private static final String KEY_LENOVO_PLATFORM = "ro.lenovo.platform"; // "qualcomm"
  96. private static final String KEY_LENOVO_ADB = "ro.lenovo.adb"; // "apkctl,speedup"
  97. private static final String VALUE_LENOVO_CLIENT_ID_BASE = "android-lenovo";
  98. /**
  99. * ROM 类型
  100. */
  101. private static final ROM ROM_TYPE = initRomType();
  102. /**
  103. * 获取 ROM 类型
  104. *
  105. * @return ROM
  106. */
  107. public static ROM getRomType() {
  108. return ROM_TYPE;
  109. }
  110. /**
  111. * 初始化 ROM 类型
  112. */
  113. private static ROM initRomType() {
  114. ROM rom = ROM.Other;
  115. FileInputStream is = null;
  116. try {
  117. Properties buildProperties = new Properties();
  118. is = new FileInputStream(new File(Environment.getRootDirectory(), "build.prop"));
  119. buildProperties.load(is);
  120. if (buildProperties.containsKey(KEY_MIUI_VERSION_NANE) || buildProperties.containsKey(KEY_MIUI_VERSION_CODE)) {
  121. // MIUI
  122. rom = ROM.MIUI;
  123. if (buildProperties.containsKey(KEY_MIUI_VERSION_NANE)) {
  124. String versionName = buildProperties.getProperty(KEY_MIUI_VERSION_NANE);
  125. if (!TextUtils.isEmpty(versionName) && versionName.matches("[Vv]\\d+")) { // V8
  126. try {
  127. rom.setBaseVersion(Integer.parseInt(versionName.split("[Vv]")[1]));
  128. } catch (Exception e) {
  129. e.printStackTrace();
  130. }
  131. }
  132. }
  133. if (buildProperties.containsKey(KEY_MIUI_VERSION)) {
  134. String versionStr = buildProperties.getProperty(KEY_MIUI_VERSION);
  135. if (!TextUtils.isEmpty(versionStr) && versionStr.matches("[\\d.]+")) {
  136. rom.setVersion(versionStr);
  137. }
  138. }
  139. } else if (buildProperties.containsKey(KEY_EMUI_VERSION) || buildProperties.containsKey(KEY_EMUI_API_LEVEL)
  140. || buildProperties.containsKey(KEY_EMUI_SYSTEM_VERSION)) {
  141. // EMUI
  142. rom = ROM.EMUI;
  143. if (buildProperties.containsKey(KEY_EMUI_VERSION)) {
  144. String versionStr = buildProperties.getProperty(KEY_EMUI_VERSION);
  145. Matcher matcher = Pattern.compile("EmotionUI_([\\d.]+)").matcher(versionStr); // EmotionUI_3.0
  146. if (!TextUtils.isEmpty(versionStr) && matcher.find()) {
  147. try {
  148. String version = matcher.group(1);
  149. rom.setVersion(version);
  150. rom.setBaseVersion(Integer.parseInt(version.split("\\.")[0]));
  151. } catch (Exception e) {
  152. e.printStackTrace();
  153. }
  154. }
  155. }
  156. } else if (buildProperties.containsKey(KEY_FLYME_SETUP) || buildProperties.containsKey(KEY_FLYME_PUBLISHED)) {
  157. // Flyme
  158. rom = ROM.Flyme;
  159. if (buildProperties.containsKey(KEY_DISPLAY_ID)) {
  160. String versionStr = buildProperties.getProperty(KEY_DISPLAY_ID);
  161. Matcher matcher =
  162. Pattern.compile("Flyme[^\\d]*([\\d.]+)[^\\d]*").matcher(versionStr);
  163. // Flyme OS 4.5.4.2U
  164. if (!TextUtils.isEmpty(versionStr) && matcher.find()) {
  165. try {
  166. String version = matcher.group(1);
  167. rom.setVersion(version);
  168. rom.setBaseVersion(Integer.parseInt(version.split("\\.")[0]));
  169. } catch (Exception e) {
  170. e.printStackTrace();
  171. }
  172. }
  173. }
  174. } else if (buildProperties.containsKey(KEY_COLOROS_VERSION) || buildProperties.containsKey(KEY_COLOROS_THEME_VERSION)
  175. || buildProperties.containsKey(KEY_COLOROS_ROM_VERSION)) {
  176. // ColorOS
  177. rom = ROM.ColorOS;
  178. if (buildProperties.containsKey(KEY_COLOROS_ROM_VERSION)) {
  179. String versionStr = buildProperties.getProperty(KEY_COLOROS_ROM_VERSION);
  180. Matcher matcher = Pattern.compile("ColorOS([\\d.]+)").matcher(versionStr); //
  181. // ColorOS2.1
  182. if (!TextUtils.isEmpty(versionStr) && matcher.find()) {
  183. try {
  184. String version = matcher.group(1);
  185. rom.setVersion(version);
  186. rom.setBaseVersion(Integer.parseInt(version.split("\\.")[0]));
  187. } catch (Exception e) {
  188. e.printStackTrace();
  189. }
  190. }
  191. }
  192. } else if (buildProperties.containsKey(KEY_FUNTOUCHOS_OS_NAME) || buildProperties.containsKey(KEY_FUNTOUCHOS_OS_VERSION)
  193. || buildProperties.containsKey(KEY_FUNTOUCHOS_DISPLAY_ID)) {
  194. // FuntouchOS
  195. rom = ROM.FuntouchOS;
  196. if (buildProperties.containsKey(KEY_FUNTOUCHOS_OS_VERSION)) {
  197. String versionStr = buildProperties.getProperty(KEY_FUNTOUCHOS_OS_VERSION);
  198. if (!TextUtils.isEmpty(versionStr) && versionStr.matches("[\\d.]+")) { // 3.0
  199. try {
  200. rom.setVersion(versionStr);
  201. rom.setBaseVersion(Integer.parseInt(versionStr.split("\\.")[0]));
  202. } catch (Exception e) {
  203. e.printStackTrace();
  204. }
  205. }
  206. }
  207. } else if (buildProperties.containsKey(KEY_EUI_VERSION) || buildProperties.containsKey(KEY_EUI_NAME)
  208. || buildProperties.containsKey(KEY_EUI_MODEL)) {
  209. // EUI
  210. rom = ROM.EUI;
  211. if (buildProperties.containsKey(KEY_EUI_VERSION)) {
  212. String versionStr = buildProperties.getProperty(KEY_EUI_VERSION);
  213. Matcher matcher = Pattern.compile("([\\d.]+)[^\\d]*").matcher(versionStr); //
  214. // 5.9.023S
  215. if (!TextUtils.isEmpty(versionStr) && matcher.find()) {
  216. try {
  217. String version = matcher.group(1);
  218. rom.setVersion(version);
  219. rom.setBaseVersion(Integer.parseInt(version.split("\\.")[0]));
  220. } catch (Exception e) {
  221. e.printStackTrace();
  222. }
  223. }
  224. }
  225. } else if (buildProperties.containsKey(KEY_AMIGO_ROM_VERSION) || buildProperties.containsKey(KEY_AMIGO_SYSTEM_UI_SUPPORT)) {
  226. // amigo
  227. rom = ROM.AmigoOS;
  228. if (buildProperties.containsKey(KEY_DISPLAY_ID)) {
  229. String versionStr = buildProperties.getProperty(KEY_DISPLAY_ID);
  230. Matcher matcher =
  231. Pattern.compile("amigo([\\d.]+)[a-zA-Z]*").matcher(versionStr); //
  232. // "amigo3.5.1"
  233. if (!TextUtils.isEmpty(versionStr) && matcher.find()) {
  234. try {
  235. String version = matcher.group(1);
  236. rom.setVersion(version);
  237. rom.setBaseVersion(Integer.parseInt(version.split("\\.")[0]));
  238. } catch (Exception e) {
  239. e.printStackTrace();
  240. }
  241. }
  242. }
  243. } else if (buildProperties.containsKey(KEY_SONY_PROTOCOL_TYPE) || buildProperties.containsKey(KEY_SONY_ENCRYPTED_DATA)) {
  244. // Sony
  245. rom = ROM.Sony;
  246. } else if (buildProperties.containsKey(KEY_YULONG_VERSION_RELEASE) || buildProperties.containsKey(KEY_YULONG_VERSION_TAG)) {
  247. // YuLong
  248. rom = ROM.YuLong;
  249. } else if (buildProperties.containsKey(KEY_SENSE_BUILD_STAGE) || buildProperties.containsKey(KEY_SENSE_BLUETOOTH_SAP)) {
  250. // Sense
  251. rom = ROM.Sense;
  252. } else if (buildProperties.containsKey(KEY_LG_SW_VERSION) || buildProperties.containsKey(KEY_LG_SW_VERSION_SHORT)
  253. || buildProperties.containsKey(KEY_LG_FACTORY_VERSION)) {
  254. // LG
  255. rom = ROM.LG;
  256. } else if (buildProperties.containsKey(KEY_LENOVO_DEVICE) || buildProperties.containsKey(KEY_LENOVO_PLATFORM)
  257. || buildProperties.containsKey(KEY_LENOVO_ADB)) {
  258. // Lenovo
  259. rom = ROM.Lenovo;
  260. } else if (buildProperties.containsKey(KEY_DISPLAY_ID)) {
  261. String displayId = buildProperties.getProperty(KEY_DISPLAY_ID);
  262. if (!TextUtils.isEmpty(displayId)) {
  263. if (displayId.contains(VALUE_FLYME_DISPLAY_ID_CONTAIN)) {
  264. return ROM.Flyme;
  265. } else if (displayId.contains(VALUE_AMIGO_DISPLAY_ID_CONTAIN)) {
  266. return ROM.AmigoOS;
  267. }
  268. }
  269. } else if (buildProperties.containsKey(KEY_BASE_OS_VERSION)) {
  270. String baseOsVersion = buildProperties.getProperty(KEY_BASE_OS_VERSION);
  271. if (!TextUtils.isEmpty(baseOsVersion)) {
  272. if (baseOsVersion.contains(VALUE_COLOROS_BASE_OS_VERSION_CONTAIN)) {
  273. return ROM.ColorOS;
  274. } else if (baseOsVersion.contains(VALUE_SAMSUNG_BASE_OS_VERSION_CONTAIN)) {
  275. return ROM.SamSung;
  276. }
  277. }
  278. } else if (buildProperties.containsKey(KEY_CLIENT_ID_BASE)) {
  279. String clientIdBase = buildProperties.getProperty(KEY_CLIENT_ID_BASE);
  280. switch (clientIdBase) {
  281. case VALUE_MIUI_CLIENT_ID_BASE:
  282. return ROM.MIUI;
  283. case VALUE_COLOROS_CLIENT_ID_BASE:
  284. return ROM.ColorOS;
  285. case VALUE_FUNTOUCHOS_CLIENT_ID_BASE:
  286. return ROM.FuntouchOS;
  287. case VALUE_SAMSUNG_CLIENT_ID_BASE:
  288. return ROM.SamSung;
  289. case VALUE_SONY_CLIENT_ID_BASE:
  290. return ROM.Sony;
  291. case VALUE_YULONG_CLIENT_ID_BASE:
  292. return ROM.YuLong;
  293. case VALUE_SENSE_CLIENT_ID_BASE:
  294. return ROM.Sense;
  295. case VALUE_LENOVO_CLIENT_ID_BASE:
  296. return ROM.Lenovo;
  297. case VALUE_AMIGO_CLIENT_ID_BASE:
  298. return ROM.AmigoOS;
  299. default:
  300. break;
  301. }
  302. }
  303. } catch (IOException e) {
  304. e.printStackTrace();
  305. } finally {
  306. if (is != null) {
  307. try {
  308. is.close();
  309. } catch (IOException e) {
  310. e.printStackTrace();
  311. }
  312. }
  313. }
  314. return rom;
  315. }
  316. public enum ROM {
  317. MIUI, // 小米
  318. Flyme, // 魅族
  319. EMUI, // 华为
  320. ColorOS, // OPPO
  321. FuntouchOS, // vivo
  322. SmartisanOS, // 锤子
  323. EUI, // 乐视
  324. Sense, // HTC
  325. AmigoOS, // 金立
  326. _360OS, // 奇酷360
  327. NubiaUI, // 努比亚
  328. H2OS, // 一加
  329. YunOS, // 阿里巴巴
  330. YuLong, // 酷派
  331. SamSung, // 三星
  332. Sony, // 索尼
  333. Lenovo, // 联想
  334. LG, // LG
  335. Google, // 原生
  336. Other; // CyanogenMod, Lewa OS, 百度云OS, Tencent OS, 深度OS, IUNI OS, Tapas OS, Mokee
  337. private int baseVersion = -1;
  338. private String version;
  339. public int getBaseVersion() {
  340. return baseVersion;
  341. }
  342. void setBaseVersion(int baseVersion) {
  343. this.baseVersion = baseVersion;
  344. }
  345. public String getVersion() {
  346. return version;
  347. }
  348. void setVersion(String version) {
  349. this.version = version;
  350. }
  351. }
  352. }