zoukankan      html  css  js  c++  java
  • 判断小米华为等系统 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

  • 相关阅读:
    C#秘密武器之表达式树
    C#秘密武器之特性
    [转]拷贝构造函数详解
    [转]STL 容器一些底层机制
    C++ Qt多线程 TcpSocket服务器实例
    QByteArray储存二进制数据(包括结构体,自定义QT对象)
    [转]浅谈 C++ 中的 new/delete 和 new[]/delete[]
    [转]QList内存释放
    Subscribe的第四个参数用法
    ROS多线程订阅消息
  • 原文地址:https://www.cnblogs.com/baiqiantao/p/b97c04c79912e606c917429fdf6533fb.html
Copyright © 2011-2022 走看看