1. 程式人生 > >[Android] 程式碼獲取手機系統型別(小米MIUI、華為EMUI、魅族FLYME)

[Android] 程式碼獲取手機系統型別(小米MIUI、華為EMUI、魅族FLYME)

我們都知道,現在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方法加入識別比對即可。