关于设置状态栏字体颜色,判断MIUI、flyme系统的一些总结 您所在的位置:网站首页 miui状态栏不显示 关于设置状态栏字体颜色,判断MIUI、flyme系统的一些总结

关于设置状态栏字体颜色,判断MIUI、flyme系统的一些总结

#关于设置状态栏字体颜色,判断MIUI、flyme系统的一些总结| 来源: 网络整理| 查看: 265

此博客结合之前一篇博客沉浸式状态栏使用,当我把ActionBar设置为白色时,状态栏背景也是白色,而系统状态栏的字体颜色默认就是白色,这样就看不见状态栏上的内容了,所以我们的需求就是改变状态栏字体颜色。

通过了解,Android从6.0开始才提供修改状态栏字体颜色的API,而小米在Android4.4和魅族在Flyme 4提供了自家的修改方法,我们知道MIUI7对应Android4.4、Flyme4对应Android5.0。所以就要判断手机系统是否为MIUI基于Android4.4-Android6.0之间,如果是就要使用MIUI自家的方法,如果手机系统为Flyme基于Android5.0-6.0就要使用Flyme自家的方法。 所以在判断系统版本时找到了大概以下几种方式: 一、判断MIUI 1、通过Properties根据MIUI的key来读取属性,实测在小米mix2运行时,在load的时候出现了异常FileNotFoundException,不可行。 此方式还有一种单例写法,自定义一个BuildProperties。

private static boolean isMiUI() { try { final Properties properties = new Properties(); // 这里读文件有异常 FileNotFoundException properties.load(new FileInputStream(new File(Environment.getRootDirectory(), "build.prop"))); String uiCode = properties.getProperty("ro.miui.ui.version.code", null); if (uiCode != null) { return true; } else { return false; } } catch (final Exception e) { return false; } }

二、判断Flyme 1、通过反射,此方法在魅族16s上运行在getMethod异常,不可行。

public static boolean isFlyme() { try { final Method method = Build.class.getMethod("hasSmartBar"); return method != null; } catch (final Exception e) { return false; } }

2、通过Build.DISPLAY比对,此方法对判断Flyme系统可行。

private static boolean isFlymeV4OrAbove() { String displayId = Build.DISPLAY; if (!TextUtils.isEmpty(displayId) && displayId.contains("Flyme")) { String[] displayIdArray = displayId.split(" "); for (String temp : displayIdArray) { //版本号4以上,形如4.x. if (temp.matches("^[4-9]\\.(\\d+\\.)+\\S*")) { return true; } } } return false; }

我用了5部手机做了测试:

在这里插入图片描述 从测试结果看魅族的Build.DISPLAY是系统版本号,上面方法2确实可行。从以上结果来看MIUI没办法判断,但是我们观察上图发现Build.BRAND是每个手机的品牌名,我们结合Build.VERSION.SDK_INT好像能做到一些事情。

于是我就测试通过VERSION_CODE配合BRAND应该能解决以上问题。 1、当VERSION_CODE大于23(Android6.0),使用原生API设置状态栏字体颜色; 2、否则,当VERSION_CODE大于19(Android4.4),如果是MIUI就使用小米的方法; 当VERSION_CODE大于21(Android5.0),如果是Flyme就使用魅族的方法。

据统计,经过查看用户分布(2018-02-23)Android 6.0之下占33.27%,小米用户6.69%,魅族用户1.08%。所以就Android5.0-Android6.0判断一下系统,确定使用魅族的方法还是小米的方法,高于Android6.0的都用原生方法,就解决了设置状态栏字体颜色的问题。

package com.txhl.testapp.utils; import android.app.Activity; import android.content.Context; import android.graphics.Color; import android.os.Build; import android.view.View; import android.view.Window; import android.view.WindowManager; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; /** * Created by chen.yingjie on 2019/5/29 * description */ public class OsUtil { private static final String FLYME = "meizu"; private static final String MIUI = "Xiaomi"; public static void setStatusBarDarkMode(Activity activity, boolean isDark) { // android 6.0以上用原生方法 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { Window window = activity.getWindow(); //设置状态栏底色白色 window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); window.setStatusBarColor(Color.TRANSPARENT); if (isDark) { // 设置状态栏字体黑色 window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); } else { // 设置状态栏字体白色 window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); } } else { // android 5.0 -- android 6.0 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { if (isMiUI()) { setMIUIStatusBarMode(activity, isDark); } else if (isFlyme()) { setFlymeStatusBarMode(activity, isDark); } } } } /** * 小米修改状态栏字体颜色 * * MIUI 7 == android 4.4 * * @param activity * @param dark * @return */ private static boolean setMIUIStatusBarMode(Activity activity, boolean dark) { boolean result = false; Window window = activity.getWindow(); if (window != null) { Class clazz = window.getClass(); try { int darkModeFlag = 0; Class layoutParams = Class.forName("android.view.MiuiWindowManager$LayoutParams"); Field field = layoutParams.getField("EXTRA_FLAG_STATUS_BAR_DARK_MODE"); darkModeFlag = field.getInt(layoutParams); Method extraFlagField = clazz.getMethod("setExtraFlags", int.class, int.class); if (dark) { extraFlagField.invoke(window, darkModeFlag, darkModeFlag);//状态栏透明且黑色字体 } else { extraFlagField.invoke(window, 0, darkModeFlag);//清除黑色字体 } result = true; } catch (Exception e) { } } return result; } /** * 魅族修改状态栏字体颜色 * * flyme 4.0 == android 5.0 * * @param activity * @param dark * @return */ private static boolean setFlymeStatusBarMode(Activity activity, boolean dark) { boolean result = false; if (activity != null) { try { WindowManager.LayoutParams lp = activity.getWindow().getAttributes(); Field darkFlag = WindowManager.LayoutParams.class .getDeclaredField("MEIZU_FLAG_DARK_STATUS_BAR_ICON"); Field meizuFlags = WindowManager.LayoutParams.class .getDeclaredField("meizuFlags"); darkFlag.setAccessible(true); meizuFlags.setAccessible(true); int bit = darkFlag.getInt(null); int value = meizuFlags.getInt(lp); if (dark) { value |= bit; } else { value &= ~bit; } meizuFlags.setInt(lp, value); activity.getWindow().setAttributes(lp); result = true; } catch (Exception e) { } } return result; } private static boolean isFlyme() { return getBrand().equals(FLYME); } /** * 小米手机,包括红米 * @return */ private static boolean isMiUI() { return getBrand().equals(MIUI); } /** * 手机品牌 * 小米:Xiaomi 魅族:meizu 荣耀:HONOR * @return */ private static String getBrand() { return Build.BRAND; } }

由于网上找个各种博客都不能满足需求,所以我使用了这个不官方的方式来解决,如果有bug还请大家提出。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有