判斷小米華為等系統 MD


Markdown版本筆記 我的GitHub首頁 我的博客 我的微信 我的郵箱
MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina.com

目錄

判斷小米華為系統

工具類:獲取系統信息

public class SimpleDeviceUtils {

    public enum SystemType {
        /**
         * 小米手機(MIUI系統)
         */
        SYS_MIUI,
        /**
         * 華為手機(EMUI系統)
         */
        SYS_EMUI,
        /**
         * 魅族手機,FLYME系統
         */
        SYS_FLYME,
        /**
         * 其他系統
         */
        SYS_OTHER
    }

    private static final String KEY_MIUI_VERSION_NAME = "ro.miui.ui.version.name";
    private static final String KEY_MIUI_VERSION_CODE = "ro.miui.ui.version.code";
    private static final String KEY_MIUI_INTERNAL_STORAGE = "ro.miui.internal.storage";

    private static final String KEY_EMUI_API_LEVEL = "ro.build.hw_emui_api_level";
    private static final String KEY_EMUI_VERSION = "ro.build.version.emui";
    private static final String KEY_EMUI_CONFIG_HW_SYS_VERSION = "ro.confg.hw_systemversion";

    /**
     * 8.0之后有些系統信息獲取不到,沒有在各種版本手機上逐一測試
     */
    public static SystemType getSystemType() {
        try {
            Properties prop = new Properties();
            prop.load(new FileInputStream(new File(Environment.getRootDirectory(), "build.prop")));
            if (Build.MANUFACTURER.toLowerCase().equals("xiaomi")//官方提供的判斷是否為小米手機(而非MIUI系統)的方法
                    || prop.getProperty(KEY_MIUI_VERSION_NAME, null) != null//QMUI提供的判斷是否是MIUI的方法
                    || prop.getProperty(KEY_MIUI_VERSION_CODE, null) != null//下面兩個是網上補充的方法,感覺沒必要的
                    || prop.getProperty(KEY_MIUI_INTERNAL_STORAGE, null) != null) {
                return SystemType.SYS_MIUI;
            } else if (isEMUI()//華為
                    || prop.getProperty(KEY_EMUI_API_LEVEL, null) != null
                    || prop.getProperty(KEY_EMUI_VERSION, null) != null
                    || prop.getProperty(KEY_EMUI_CONFIG_HW_SYS_VERSION, null) != null) {
                return SystemType.SYS_EMUI;
            } else if (isMeizu()//魅族推送SDK中提供的判斷是否是魅族的方法
                    || DeviceHelper.isMeizu()) {//QMUI提供的判斷是否是魅族的方法
                return SystemType.SYS_FLYME;
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return SystemType.SYS_OTHER;
    }

    @SuppressLint("PrivateApi")
    private static boolean isEMUI() {
        Class<?>[] clsArray = new Class<?>[]{String.class};
        Object[] objArray = new Object[]{"ro.build.version.emui"};
        try {
            Class<?> SystemPropertiesClass = Class.forName("android.os.SystemProperties");
            Method get = SystemPropertiesClass.getDeclaredMethod("get", clsArray);
            String version = (String) get.invoke(SystemPropertiesClass, objArray);
            Log.i("bqt", "EMUI version is:" + version);
            return !TextUtils.isEmpty(version);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }

    /**
     * 判斷是否為魅族設備
     */
    private static boolean isMeizu() {
        String model = SystemProperties.get("ro.meizu.product.model");
        return (!TextUtils.isEmpty(model)) || "meizu".equalsIgnoreCase(Build.BRAND) || "22c4185e".equalsIgnoreCase(Build.BRAND);
    }
}

QMUI庫中提供的方法

//判斷系統廠商,里面的內容基本都來自QMUI庫
public class DeviceHelper {
    private final static String KEY_MIUI_VERSION_NAME = "ro.miui.ui.version.name";
    private static final String KEY_FLYME_VERSION_NAME = "ro.build.display.id";
    private final static String FLYME = "flyme";
    private final static String MEIZUBOARD[] = {"m9", "M9", "mx", "MX"};
    private static String sMiuiVersionName;
    private static String sFlymeVersionName;

    static {
        Properties properties = new Properties();

        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {// android 8.0,讀取 /system/build.prop 會報 permission denied
            FileInputStream fileInputStream = null;
            try {
                fileInputStream = new FileInputStream(new File(Environment.getRootDirectory(), "build.prop"));
                properties.load(fileInputStream);
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if (fileInputStream != null) {
                    try {
                        fileInputStream.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }

        try {
            Class<?> clzSystemProperties = Class.forName("android.os.SystemProperties");
            Method getMethod = clzSystemProperties.getDeclaredMethod("get", String.class);
            sMiuiVersionName = getLowerCaseName(properties, getMethod, KEY_MIUI_VERSION_NAME);
            sFlymeVersionName = getLowerCaseName(properties, getMethod, KEY_FLYME_VERSION_NAME);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private static String getLowerCaseName(Properties p, Method get, String key) {
        String name = p.getProperty(key);
        if (name == null) {
            try {
                name = (String) get.invoke(null, key);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        if (name != null) name = name.toLowerCase();
        return name;
    }

    private static boolean sIsTabletChecked = false;
    private static boolean sIsTabletValue = false;

    /**
     * 判斷是否為平板設備
     */
    public static boolean isTablet(Context context) {
        if (sIsTabletChecked) {
            return sIsTabletValue;
        } else {
            sIsTabletChecked = true;
            sIsTabletValue = (context.getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) >=
                    Configuration.SCREENLAYOUT_SIZE_LARGE;
            return sIsTabletValue;
        }
    }

    /**
     * 判斷是否是flyme系統
     */
    public static boolean isFlyme() {
        return !TextUtils.isEmpty(sFlymeVersionName) && sFlymeVersionName.contains(FLYME);
    }

    /**
     * 判斷是否是MIUI系統
     */
    public static boolean isMIUI() {
        return !TextUtils.isEmpty(sMiuiVersionName);
    }

    public static boolean isMIUIV5() {
        return "v5".equals(sMiuiVersionName);
    }

    public static boolean isMIUIV6() {
        return "v6".equals(sMiuiVersionName);
    }

    public static boolean isMIUIV7() {
        return "v7".equals(sMiuiVersionName);
    }

    public static boolean isMIUIV8() {
        return "v8".equals(sMiuiVersionName);
    }

    public static boolean isMIUIV9() {
        return "v9".equals(sMiuiVersionName);
    }

    public static boolean isFlymeVersionHigher5_2_4() {
        //查不到默認高於5.2.4
        boolean isHigher = true;
        if (sFlymeVersionName != null && !sFlymeVersionName.equals("")) {
            Pattern pattern = Pattern.compile("(\\d+\\.){2}\\d");
            Matcher matcher = pattern.matcher(sFlymeVersionName);
            if (matcher.find()) {
                String versionString = matcher.group();
                if (versionString != null && !versionString.equals("")) {
                    String[] version = versionString.split("\\.");
                    if (version.length == 3) {
                        if (Integer.valueOf(version[0]) < 5) {
                            isHigher = false;
                        } else if (Integer.valueOf(version[0]) > 5) {
                            isHigher = true;
                        } else {
                            if (Integer.valueOf(version[1]) < 2) {
                                isHigher = false;
                            } else if (Integer.valueOf(version[1]) > 2) {
                                isHigher = true;
                            } else {
                                if (Integer.valueOf(version[2]) < 4) {
                                    isHigher = false;
                                } else if (Integer.valueOf(version[2]) >= 5) {
                                    isHigher = true;
                                }
                            }
                        }
                    }

                }
            }
        }
        return isMeizu() && isHigher;
    }

    /**
     * 判斷是否為魅族
     */
    public static boolean isMeizu() {
        return isSpecialBoardPhone(MEIZUBOARD) || isFlyme();
    }

    /**
     * 判斷是否為小米,詳見https://dev.mi.com/doc/?p=254
     */
    public static boolean isXiaomi() {
        return Build.MANUFACTURER.toLowerCase().equals("xiaomi");
    }

    /**
     * 是否是指定型號的手機
     */
    private static boolean isSpecialBoardPhone(String[] boards) {
        String board = android.os.Build.BOARD;
        if (board != null) {
            for (String b : boards) {
                if (board.equals(b)) {
                    return true;
                }
            }
        }
        return false;
    }
}

2018-4-20


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM