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

2023-11-22 15:20

本文主要是介绍关于设置状态栏字体颜色,判断MIUI、flyme系统的一些总结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

此博客结合之前一篇博客沉浸式状态栏使用,当我把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();// 这里读文件有异常 FileNotFoundExceptionproperties.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.0if (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还请大家提出。

这篇关于关于设置状态栏字体颜色,判断MIUI、flyme系统的一些总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:https://blog.csdn.net/chenyingjie_Android/article/details/90672674
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/411048

相关文章

如何关闭 Mac 触发角功能或设置修饰键? mac电脑防止误触设置技巧

《如何关闭Mac触发角功能或设置修饰键?mac电脑防止误触设置技巧》从Windows换到iOS大半年来,触发角是我觉得值得吹爆的MacBook效率神器,成为一大说服理由,下面我们就来看看mac电... MAC 的「触发角」功能虽然提高了效率,但过于灵敏也让不少用户感到头疼。特别是在关键时刻,一不小心就可能触

Linux系统之authconfig命令的使用解读

《Linux系统之authconfig命令的使用解读》authconfig是一个用于配置Linux系统身份验证和账户管理设置的命令行工具,主要用于RedHat系列的Linux发行版,它提供了一系列选项... 目录linux authconfig命令的使用基本语法常用选项示例总结Linux authconfi

Python批量调整Word文档中的字体、段落间距及格式

《Python批量调整Word文档中的字体、段落间距及格式》这篇文章主要为大家详细介绍了如何使用Python的docx库来批量处理Word文档,包括设置首行缩进、字体、字号、行间距、段落对齐方式等,需... 目录关键代码一级标题设置  正文设置完整代码运行结果最近关于批处理格式的问题我查了很多资料,但是都没

Python依赖库的几种离线安装方法总结

《Python依赖库的几种离线安装方法总结》:本文主要介绍如何在Python中使用pip工具进行依赖库的安装和管理,包括如何导出和导入依赖包列表、如何下载和安装单个或多个库包及其依赖,以及如何指定... 目录前言一、如何copy一个python环境二、如何下载一个包及其依赖并安装三、如何导出requirem

基于Python实现一个PDF特殊字体提取工具

《基于Python实现一个PDF特殊字体提取工具》在PDF文档处理场景中,我们常常需要针对特定格式的文本内容进行提取分析,本文介绍的PDF特殊字体提取器是一款基于Python开发的桌面应用程序感兴趣的... 目录一、应用背景与功能概述二、技术架构与核心组件2.1 技术选型2.2 系统架构三、核心功能实现解析

Nginx配置系统服务&设置环境变量方式

《Nginx配置系统服务&设置环境变量方式》本文介绍了如何将Nginx配置为系统服务并设置环境变量,以便更方便地对Nginx进行操作,通过配置系统服务,可以使用系统命令来启动、停止或重新加载Nginx... 目录1.Nginx操作问题2.配置系统服android务3.设置环境变量总结1.Nginx操作问题

C++实现回文串判断的两种高效方法

《C++实现回文串判断的两种高效方法》文章介绍了两种判断回文串的方法:解法一通过创建新字符串来处理,解法二在原字符串上直接筛选判断,两种方法都使用了双指针法,文中通过代码示例讲解的非常详细,需要的朋友... 目录一、问题描述示例二、解法一:将字母数字连接到新的 string思路代码实现代码解释复杂度分析三、

grom设置全局日志实现执行并打印sql语句

《grom设置全局日志实现执行并打印sql语句》本文主要介绍了grom设置全局日志实现执行并打印sql语句,包括设置日志级别、实现自定义Logger接口以及如何使用GORM的默认logger,通过这些... 目录gorm中的自定义日志gorm中日志的其他操作日志级别Debug自定义 Loggergorm中的

CSS3 最强二维布局系统之Grid 网格布局

《CSS3最强二维布局系统之Grid网格布局》CS3的Grid网格布局是目前最强的二维布局系统,可以同时对列和行进行处理,将网页划分成一个个网格,可以任意组合不同的网格,做出各种各样的布局,本文介... 深入学习 css3 目前最强大的布局系统 Grid 网格布局Grid 网格布局的基本认识Grid 网

Rust格式化输出方式总结

《Rust格式化输出方式总结》Rust提供了强大的格式化输出功能,通过std::fmt模块和相关的宏来实现,主要的输出宏包括println!和format!,它们支持多种格式化占位符,如{}、{:?}... 目录Rust格式化输出方式基本的格式化输出格式化占位符Format 特性总结Rust格式化输出方式