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

判断小米 魅族 华为 系统 MIUI EMUI FLYME的更多相关文章

  1. 「知乎」对中国用户而言,Pure Android 是否比 MIUI 或 Flyme 体验更好? - Donnie的博客

    这篇文章转载自我在知乎上的回答 哎呀-不要站队嘛.其实这是一个很有意思的题目,让我们一点点来看 哦对,谢妖-.本人是Nexus 5用户,系统当然是Pure Android KitKat啦(臭谷粉!点D ...

  2. 小米平板2 win10 MIUI互刷教程

    在这篇文章中,我们会为大家提供Windows 10版小米平板2刷入MIUI和MIUI版小米平板2刷入Windows 10的两组教程. 不过从Win 10刷MIUI需要用原生安卓系统过渡来统一bios版 ...

  3. 针对在webview模式中,小米魅族手机不支持html5原生video的control的解决办法![原创]

    其实,解决办法就是,重新写个control控制功能,.同样用流行的video.js可以实现 第一步就是增加个播放的图片..要不然没有按钮多难看! <div class="videoDi ...

  4. swift学习笔记 - 判断当前运行的系统和平台

    最近代码需要判断代码运行的系统与平台,下面总结了一下swift下一些可以用来判断的属性: // 代码运行在32位的 Windows public var TARGET_OS_MAC: Int32 { ...

  5. javascript如何判断手机是什么系统

    做H5页面的时候,经常会用到判断手机是什么系统,根据系统的型号,实现不同的效果,那么如何判断显示页面的手机型号呢? (function(){ var isMobile={ Android:functi ...

  6. 如何判断你的windows系统是32位还是64位?

    [学习笔记] 如 何判断你的windows系统是32位还是64位? java -version时,如果没有64就是32位的.eclipse.ini中如果没有64,就是32位的.但是我们的ini文件里面 ...

  7. 小米开源监控系统Open-Falcon安装使用笔记

    小米开源监控系统Open-Falcon安装使用笔记-BB保你大-51CTO博客 https://blog.51cto.com/chenguomin/1865550

  8. android通过代码获取华为手机的EMUI系统版本号

    因为app中用到华为推送,但是华为推送在不同版本上是存在不同问题的,需要单独来处理. 那么最基本的问题是要获取EMUI系统的版本号. 上网翻了很多博客帖子,基本上是在获取root权限下去读取/syst ...

  9. 获取Win和Linux系统启动时间,类似uptime功能,用于判断是否修改过系统时间

    目录 前言 测试代码 Win测试 Linux测试 总结 前言 有时候需要判断系统是否有修改过时间,最简单的方法就是获取当前时间A,然后sleep X秒,然后获取 时间B,如果 时间B - 时间A ≠ ...

随机推荐

  1. mysql三大特性、三范式、五大约束

    1.数据库的三大特性 '实体':表 '属性':表中的数据(字段) '关系':表与表之间的关系 2.数据库设计三大范式 a:确保每列保持原子性(即数据库表中的所有字段值是不可分解的原子值) b:确保表中 ...

  2. JZYZOJ 2041 快速数论变换 NTT 多项式

    http://172.20.6.3/Problem_Show.asp?id=2041 https://blog.csdn.net/ggn_2015/article/details/68922404 代 ...

  3. 在Activity中响应ListView内部按钮的点击事件的两种方法

    转载:http://www.cnblogs.com/ivan-xu/p/4124967.html 最近交流群里面有人问到一个问题:如何在Activity中响应ListView内部按钮的点击事件,不要在 ...

  4. [原创]用Charles模拟App各种网络带宽测试介绍

    [原创]用Charles模拟App各种网络带宽测试介绍 相信每个测试在进行自己公司App测试时,都会碰到一个问题,如何去模拟各种App在各种带宽下的测试情况,估计很少有公司直接去采用2g/3g/4g卡 ...

  5. C# .Net 多进程同步 通信 共享内存 内存映射文件 Memory Mapped

    节点通信存在两种模型:共享内存(Shared memory)和消息传递(Messages passing). 内存映射文件对于托管世界的开发人员来说似乎很陌生,但它确实已经是很远古的技术了,而且在操作 ...

  6. Golang 处理 Json(一):编码

    JSON 是一种数据格式描述语言.以 key 和 value 构成的哈系结构,类似 Javascript 中的对象,python 中的字典.通常 json 格式的 key 是字符串,其值可以是任意类型 ...

  7. AngularJS路由系列(1)--基本路由配置

    本系列探寻AngularJS的路由机制,在WebStorm下开发.主要包括: ● 路由的Big Picture ● $routeProvider配置路由 ● 使用template属性 ● 使用temp ...

  8. [Win32]获取指定进程的父进程PID

    // // #include <Windows.h> #include <winnt.h> #include <winternl.h> typedef NTSTAT ...

  9. iPhone开发中从一个视图跳到另一个视图有三种方法:

    iPhone开发中从一个视图跳到另一个视图有三种方法:   1.self.view addSubView:view .self.window addSubView,需要注意的是,这个方法只是把页面加在 ...

  10. C#编程(七十二)----------DynamicObject和ExpandoObject

    DynamicObject和ExpandoObject 1.ExpandoObject表示一个对象,该对象包含可在运行时动态添加和移除的成员.这个类和动态类型有关,这个类能做些什么? 案例: //Ex ...