[Android] 程式碼獲取手機系統型別(小米MIUI、華為EMUI、魅族FLYME)
阿新 • • 發佈:2019-02-11
我們都知道,現在Android系統手機各式各樣,包括三星、華為、小米、魅族等等,它們的系統都不是原生的Android系統,都是經過手機廠商修改過的,並且通過刷機可以在不同手機刷各式各樣的系統,在一些應用中需要根據不同的系統做不同的處理,因此我們就需要獲取手機使用的什麼系統,現在主要介紹一下華為、小米、魅族三種系統的獲取方法。
原理:在Android系統中有一個類似Windows系統登錄檔的檔案build.prop。這個檔案內定義了系統初始(或永久)的一些引數屬性、功能的開放等。
下面是某安卓系統的build.prop部分程式碼:
# begin build properties (開始設定系統性能) # autogenerated (通過設定形成系統資訊) ro.=GRI40 (版本ID) ro.build.=GRJ22 (版本號) ro.build.version.incremental=eng.buildbot.20110619.060228 (版本增量) ro.build.version.sdk=10 (sdk版本) ro.build.version.codename=REL (版本代號) ro.build.version.release=2.3.4 (Android 2.3.4系統) ro.build.date=Sun Jun 19 06:02:58 UTC 2011 (製作者及製作時間) ro.build.date.utc=0 ro.build.type=user (編譯模式,如user,userdebug,eng,test模式) ro.build.user=buildbot (編譯賬戶) ro.build.host=bb1 (編譯主機系統) ro.build.tags=test-keys (編譯標籤) ro.product.model=HTC Wildfire (HTC內部手機代號) ro.product.brand=htc_wwe (手機品牌) ro.product.name=htc_buzz (手機正式名稱) ro.product.device=buzz (採用的裝置) ro.product.board=buzz (採用的處理器) ro.product.cpu.abi=armeabi-v6j (cpu的版本) ro.product.cpu.abi2=armeabi (cpu的品牌) ro.product.manufacturer=HTC (手機制造商)
其實這些配置引數是以鍵值對的方式存放,一般情況下廠商定製ROM的時候會在定製的ROM裡面加入ROM特有的標識(當然不排除有些ROM在不同版本中使用不同的版本標識),我們可以根據這些ROM標識對常見的ROM進行識別。
關鍵程式碼如下:
public class OSUtils { //MIUI標識 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"; //EMUI標識 private static final String KEY_EMUI_VERSION_CODE = "ro.build.version.emui"; private static final String KEY_EMUI_API_LEVEL = "ro.build.hw_emui_api_level"; private static final String KEY_EMUI_CONFIG_HW_SYS_VERSION = "ro.confg.hw_systemversion"; //Flyme標識 private static final String KEY_FLYME_ID_FALG_KEY = "ro.build.display.id"; private static final String KEY_FLYME_ID_FALG_VALUE_KEYWORD = "Flyme"; private static final String KEY_FLYME_ICON_FALG = "persist.sys.use.flyme.icon"; private static final String KEY_FLYME_SETUP_FALG = "ro.meizu.setupwizard.flyme"; private static final String KEY_FLYME_PUBLISH_FALG = "ro.flyme.published"; /** * @param * @return ROM_TYPE ROM型別的列舉 * @description獲取ROM型別: MIUI_ROM, FLYME_ROM, EMUI_ROM, OTHER_ROM */ public static ROM_TYPE getRomType() { ROM_TYPE rom_type = ROM_TYPE.OTHER; try { BuildProperties buildProperties = BuildProperties.getInstance(); if (buildProperties.containsKey(KEY_EMUI_VERSION_CODE) || buildProperties.containsKey(KEY_EMUI_API_LEVEL) || buildProperties.containsKey(KEY_EMUI_CONFIG_HW_SYS_VERSION)) { return ROM_TYPE.EMUI; } if (buildProperties.containsKey(KEY_MIUI_VERSION_CODE) || buildProperties.containsKey(KEY_MIUI_VERSION_NAME) || buildProperties.containsKey(KEY_MIUI_INTERNAL_STORAGE)) { return ROM_TYPE.MIUI; } if (buildProperties.containsKey(KEY_FLYME_ICON_FALG) || buildProperties.containsKey(KEY_FLYME_SETUP_FALG) || buildProperties.containsKey(KEY_FLYME_PUBLISH_FALG)) { return ROM_TYPE.FLYME; } if (buildProperties.containsKey(KEY_FLYME_ID_FALG_KEY)) { String romName = buildProperties.getProperty(KEY_FLYME_ID_FALG_KEY); if (!TextUtils.isEmpty(romName) && romName.contains(KEY_FLYME_ID_FALG_VALUE_KEYWORD)) { return ROM_TYPE.FLYME; } } } catch (IOException e) { e.printStackTrace(); } return rom_type; } public enum ROM_TYPE { MIUI, FLYME, EMUI, OTHER } }
使用方法:
OSUtils.ROM_TYPE romType = = OSUtils.getRomType();
可能您需要對其他的ROM進行區分,那麼只需三步:
1、使用BuildProperties獲取到所有的key, 遍歷獲取到所有的value(getProperty),或者直接找到build.prop檔案。
2、找到定製ROM特徵的標識(key/value)
3、增加ROM_TYPE列舉型別,getRomType方法加入識別比對即可。