1.两个工具类和一个xml就完成了
直接复制即可
package com.example.tongliaodemo.activity; import android.app.Activity; import android.content.Context; import android.graphics.Color; import android.os.Build; import android.view.View; import android.view.ViewGroup; import android.view.Window; import android.view.WindowManager; import android.widget.FrameLayout; import com.example.tongliaodemo.R; import java.lang.reflect.Field; import java.lang.reflect.Method; / * 沉浸式状态栏工具 * 杨亚东 * @since 2021-1-19 */ public class StatusBarUtils { private static final int FAKE_STATUS_BAR_VIEW_ID = R.id.fake_status_bar_view; / * 获得状态栏的高度 * * @param context 上下文 * @return 状态栏高度 */ public static int getHeight(Context context) { int statusBarHeight = 0; try { int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android"); if (resourceId > 0) { statusBarHeight = context.getResources().getDimensionPixelSize(resourceId); } } catch (Exception e) { e.printStackTrace(); } return statusBarHeight; } / * 设置状态栏颜色 * * @param context 上下文,尽量使用Activity * @param color 状态栏颜色 */ public static void setColor(Context context, int color) { if (context instanceof Activity) { setColor(((Activity) context).getWindow(), color); } } / * 设置状态栏颜色 * * @param window 窗口,可用于Activity和Dialog等 * @param color 状态栏颜色 */ public static void setColor(Window window, int color) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE); window.setStatusBarColor(color); } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { setColor(window, color, false); } } / * Android 5.0 以下版本设置状态栏颜色 * * @param window 窗口 * @param color 状态栏颜色值 * @param isTransparent 是否透明 */ public static void setColor(Window window, int color, boolean isTransparent) { Context context = window.getContext(); window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); ViewGroup decorView = (ViewGroup) window.getDecorView(); View contentView = decorView.findViewById(android.R.id.content); if (contentView != null) { contentView.setPadding(0, isTransparent ? 0 : getHeight(context), 0, 0); } View fakeStatusBarView = decorView.findViewById(FAKE_STATUS_BAR_VIEW_ID); if (fakeStatusBarView != null) { fakeStatusBarView.setBackgroundColor(color); if (fakeStatusBarView.getVisibility() == View.GONE) { fakeStatusBarView.setVisibility(View.VISIBLE); } } else { // 绘制一个和状态栏一样高的矩形 View statusBarView = new View(context); FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, getHeight(context)); statusBarView.setLayoutParams(layoutParams); statusBarView.setBackgroundColor(color); statusBarView.setId(FAKE_STATUS_BAR_VIEW_ID); decorView.addView(statusBarView); } } / * 设置状态栏透明 * * @param context 上下文,尽量使用Activity */ public static void setTransparent(Context context) { if (context instanceof Activity) { setTransparent(((Activity) context).getWindow()); } } / * 设置状态栏透明 * * @param window 窗口,可用于Activity和Dialog等 */ public static void setTransparent(Window window) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); window.setStatusBarColor(Color.TRANSPARENT); } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { setColor(window, 0x, true); } } / * 设置状态栏是否为黑色文字 * * @param context 上下文,尽量使用Activity * @param isDark 是否为黑色文字 */ public static void setTextDark(Context context, boolean isDark) { if (context instanceof Activity) { setTextDark(((Activity) context).getWindow(), isDark); } } / * 设置状态栏是否为黑色文字 * * @param window 窗口,可用于Activity和全屏Dialog * @param isDark 是否为黑色文字 */ private static void setTextDark(Window window, boolean isDark) { if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) { View decorView = window.getDecorView(); int systemUiVisibility = decorView.getSystemUiVisibility(); if (isDark) { decorView.setSystemUiVisibility(systemUiVisibility | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); } else { decorView.setSystemUiVisibility(systemUiVisibility & ~View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); } } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { switch (OSUtils.getRomType()) { case MIUI: setMIUIDark(window, isDark); break; case Flyme: setFlymeDark(window, isDark); break; default: } } } / * 设置MIUI系统状态栏是否为黑色文字 * * @param window 窗口,仅可用于Activity * @param isDark 是否为黑色文字 */ private static void setMIUIDark(Window window, boolean isDark) { try { Class<? extends Window> clazz = window.getClass(); int darkModeFlag; 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); extraFlagField.invoke(window, isDark ? darkModeFlag : 0, darkModeFlag); } catch (Exception e) { e.printStackTrace(); } } / * 设置Flyme系统状态栏是否为黑色文字 * * @param window 窗口 * @param isDark 是否为黑色文字 */ private static void setFlymeDark(Window window, boolean isDark) { if (window != null) { try { WindowManager.LayoutParams lp = window.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 (isDark) { value |= bit; } else { value &= ~bit; } meizuFlags.setInt(lp, value); window.setAttributes(lp); } catch (Exception e) { e.printStackTrace(); } } } }
讯享网
讯享网package com.example.tongliaodemo.activity; import android.os.Environment; import android.text.TextUtils; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.util.Properties; import java.util.regex.Matcher; import java.util.regex.Pattern; / * 杨亚东 * 2021.1.19 */ public class OSUtils { private static final String KEY_DISPLAY_ID = "ro.build.display.id"; private static final String KEY_BASE_OS_VERSION = "ro.build.version.base_os"; private static final String KEY_CLIENT_ID_BASE = "ro.com.google.clientidbase"; // 小米 : MIUI private static final String KEY_MIUI_VERSION = "ro.build.version.incremental"; // "7.6.15" private static final String KEY_MIUI_VERSION_NANE = "ro.miui.ui.version.name"; // "V8" private static final String KEY_MIUI_VERSION_CODE = "ro.miui.ui.version.code"; // "6" private static final String VALUE_MIUI_CLIENT_ID_BASE = "android-xiaomi"; // 华为 : EMUI private static final String KEY_EMUI_VERSION = "ro.build.version.emui"; // "EmotionUI_3.0" private static final String KEY_EMUI_API_LEVEL = "ro.build.hw_emui_api_level"; // private static final String KEY_EMUI_SYSTEM_VERSION = "ro.confg.hw_systemversion"; // // "T1-A21wV100R001C233B008_SYSIMG" // 魅族 : Flyme private static final String KEY_FLYME_PUBLISHED = "ro.flyme.published"; // "true" private static final String KEY_FLYME_SETUP = "ro.meizu.setupwizard.flyme"; // "true" private static final String VALUE_FLYME_DISPLAY_ID_CONTAIN = "Flyme"; // "Flyme OS 4.5.4.2U" // OPPO : ColorOS private static final String KEY_COLOROS_VERSION = "ro.oppo.theme.version"; // "703" private static final String KEY_COLOROS_THEME_VERSION = "ro.oppo.version"; // "" private static final String KEY_COLOROS_ROM_VERSION = "ro.rom.different.version"; // private static final String VALUE_COLOROS_BASE_OS_VERSION_CONTAIN = "OPPO"; // "OPPO/R7sm // "ColorOS2.1" // /R7sm:5.1.1/LMY47V/:user/release-keys" private static final String VALUE_COLOROS_CLIENT_ID_BASE = "android-oppo"; // vivo : FuntouchOS private static final String KEY_FUNTOUCHOS_BOARD_VERSION = "ro.vivo.board.version"; // "MD" private static final String KEY_FUNTOUCHOS_OS_NAME = "ro.vivo.os.name"; // "Funtouch" private static final String KEY_FUNTOUCHOS_OS_VERSION = "ro.vivo.os.version"; // "3.0" private static final String KEY_FUNTOUCHOS_DISPLAY_ID = "ro.vivo.os.build.display.id"; // // "FuntouchOS_3.0" private static final String KEY_FUNTOUCHOS_ROM_VERSION = "ro.vivo.rom.version"; // "rom_3.1" private static final String VALUE_FUNTOUCHOS_CLIENT_ID_BASE = "android-vivo"; // Samsung private static final String VALUE_SAMSUNG_BASE_OS_VERSION_CONTAIN = "samsung"; // "samsung // /zeroltezc/zeroltechn:6.0.1/MMB29K/G9250ZCU2DQD1:user/release-keys" private static final String VALUE_SAMSUNG_CLIENT_ID_BASE = "android-samsung"; // Sony private static final String KEY_SONY_PROTOCOL_TYPE = "ro.sony.irremote.protocol_type"; // "2" private static final String KEY_SONY_ENCRYPTED_DATA = "ro.sony.fota.encrypteddata"; // private static final String VALUE_SONY_CLIENT_ID_BASE = "android-sonyericsson"; // "supported" // 乐视 : eui private static final String KEY_EUI_VERSION = "ro.letv.release.version"; // "5.9.023S" private static final String KEY_EUI_VERSION_DATE = "ro.letv.release.version_date"; // "5.9 // .023S_03111" private static final String KEY_EUI_NAME = "ro.product.letv_name"; // "乐1s" private static final String KEY_EUI_MODEL = "ro.product.letv_model"; // "Letv X500" // 金立 : amigo private static final String KEY_AMIGO_ROM_VERSION = "ro.gn.gnromvernumber"; // "GIONEE ROM5.0 // .16" private static final String KEY_AMIGO_SYSTEM_UI_SUPPORT = "ro.gn.amigo.systemui.support"; // private static final String VALUE_AMIGO_DISPLAY_ID_CONTAIN = "amigo"; // "amigo3.5.1" // "yes" private static final String VALUE_AMIGO_CLIENT_ID_BASE = "android-gionee"; // 酷派 : yulong private static final String KEY_YULONG_VERSION_RELEASE = "ro.yulong.version.release"; // "5.1 // .046.P1..8676_M01" private static final String KEY_YULONG_VERSION_TAG = "ro.yulong.version.tag"; // "LC" private static final String VALUE_YULONG_CLIENT_ID_BASE = "android-coolpad"; // HTC : Sense private static final String KEY_SENSE_BUILD_STAGE = "htc.build.stage"; // "2" private static final String KEY_SENSE_BLUETOOTH_SAP = "ro.htc.bluetooth.sap"; // "true" private static final String VALUE_SENSE_CLIENT_ID_BASE = "android-htc-rev"; // LG : LG private static final String KEY_LG_SW_VERSION = "ro.lge.swversion"; // "D85720b" private static final String KEY_LG_SW_VERSION_SHORT = "ro.lge.swversion_short"; // "V20b" private static final String KEY_LG_FACTORY_VERSION = "ro.lge.factoryversion"; // "LGD857AT-00 // -V20b-CUO-CN-FEB-17-2015+0" // 联想 private static final String KEY_LENOVO_DEVICE = "ro.lenovo.device"; // "phone" private static final String KEY_LENOVO_PLATFORM = "ro.lenovo.platform"; // "qualcomm" private static final String KEY_LENOVO_ADB = "ro.lenovo.adb"; // "apkctl,speedup" private static final String VALUE_LENOVO_CLIENT_ID_BASE = "android-lenovo"; / * ROM 类型 */ private static final ROM ROM_TYPE = initRomType(); / * 获取 ROM 类型 * * @return ROM */ public static ROM getRomType() { return ROM_TYPE; } / * 初始化 ROM 类型 */ private static ROM initRomType() { ROM rom = ROM.Other; FileInputStream is = null; try { Properties buildProperties = new Properties(); is = new FileInputStream(new File(Environment.getRootDirectory(), "build.prop")); buildProperties.load(is); if (buildProperties.containsKey(KEY_MIUI_VERSION_NANE) || buildProperties.containsKey(KEY_MIUI_VERSION_CODE)) { // MIUI rom = ROM.MIUI; if (buildProperties.containsKey(KEY_MIUI_VERSION_NANE)) { String versionName = buildProperties.getProperty(KEY_MIUI_VERSION_NANE); if (!TextUtils.isEmpty(versionName) && versionName.matches("[Vv]\\d+")) { // V8 try { rom.setBaseVersion(Integer.parseInt(versionName.split("[Vv]")[1])); } catch (Exception e) { e.printStackTrace(); } } } if (buildProperties.containsKey(KEY_MIUI_VERSION)) { String versionStr = buildProperties.getProperty(KEY_MIUI_VERSION); if (!TextUtils.isEmpty(versionStr) && versionStr.matches("[\\d.]+")) { rom.setVersion(versionStr); } } } else if (buildProperties.containsKey(KEY_EMUI_VERSION) || buildProperties.containsKey(KEY_EMUI_API_LEVEL) || buildProperties.containsKey(KEY_EMUI_SYSTEM_VERSION)) { // EMUI rom = ROM.EMUI; if (buildProperties.containsKey(KEY_EMUI_VERSION)) { String versionStr = buildProperties.getProperty(KEY_EMUI_VERSION); Matcher matcher = Pattern.compile("EmotionUI_([\\d.]+)").matcher(versionStr); // EmotionUI_3.0 if (!TextUtils.isEmpty(versionStr) && matcher.find()) { try { String version = matcher.group(1); rom.setVersion(version); rom.setBaseVersion(Integer.parseInt(version.split("\\.")[0])); } catch (Exception e) { e.printStackTrace(); } } } } else if (buildProperties.containsKey(KEY_FLYME_SETUP) || buildProperties.containsKey(KEY_FLYME_PUBLISHED)) { // Flyme rom = ROM.Flyme; if (buildProperties.containsKey(KEY_DISPLAY_ID)) { String versionStr = buildProperties.getProperty(KEY_DISPLAY_ID); Matcher matcher = Pattern.compile("Flyme[^\\d]*([\\d.]+)[^\\d]*").matcher(versionStr); // Flyme OS 4.5.4.2U if (!TextUtils.isEmpty(versionStr) && matcher.find()) { try { String version = matcher.group(1); rom.setVersion(version); rom.setBaseVersion(Integer.parseInt(version.split("\\.")[0])); } catch (Exception e) { e.printStackTrace(); } } } } else if (buildProperties.containsKey(KEY_COLOROS_VERSION) || buildProperties.containsKey(KEY_COLOROS_THEME_VERSION) || buildProperties.containsKey(KEY_COLOROS_ROM_VERSION)) { // ColorOS rom = ROM.ColorOS; if (buildProperties.containsKey(KEY_COLOROS_ROM_VERSION)) { String versionStr = buildProperties.getProperty(KEY_COLOROS_ROM_VERSION); Matcher matcher = Pattern.compile("ColorOS([\\d.]+)").matcher(versionStr); // // ColorOS2.1 if (!TextUtils.isEmpty(versionStr) && matcher.find()) { try { String version = matcher.group(1); rom.setVersion(version); rom.setBaseVersion(Integer.parseInt(version.split("\\.")[0])); } catch (Exception e) { e.printStackTrace(); } } } } else if (buildProperties.containsKey(KEY_FUNTOUCHOS_OS_NAME) || buildProperties.containsKey(KEY_FUNTOUCHOS_OS_VERSION) || buildProperties.containsKey(KEY_FUNTOUCHOS_DISPLAY_ID)) { // FuntouchOS rom = ROM.FuntouchOS; if (buildProperties.containsKey(KEY_FUNTOUCHOS_OS_VERSION)) { String versionStr = buildProperties.getProperty(KEY_FUNTOUCHOS_OS_VERSION); if (!TextUtils.isEmpty(versionStr) && versionStr.matches("[\\d.]+")) { // 3.0 try { rom.setVersion(versionStr); rom.setBaseVersion(Integer.parseInt(versionStr.split("\\.")[0])); } catch (Exception e) { e.printStackTrace(); } } } } else if (buildProperties.containsKey(KEY_EUI_VERSION) || buildProperties.containsKey(KEY_EUI_NAME) || buildProperties.containsKey(KEY_EUI_MODEL)) { // EUI rom = ROM.EUI; if (buildProperties.containsKey(KEY_EUI_VERSION)) { String versionStr = buildProperties.getProperty(KEY_EUI_VERSION); Matcher matcher = Pattern.compile("([\\d.]+)[^\\d]*").matcher(versionStr); // // 5.9.023S if (!TextUtils.isEmpty(versionStr) && matcher.find()) { try { String version = matcher.group(1); rom.setVersion(version); rom.setBaseVersion(Integer.parseInt(version.split("\\.")[0])); } catch (Exception e) { e.printStackTrace(); } } } } else if (buildProperties.containsKey(KEY_AMIGO_ROM_VERSION) || buildProperties.containsKey(KEY_AMIGO_SYSTEM_UI_SUPPORT)) { // amigo rom = ROM.AmigoOS; if (buildProperties.containsKey(KEY_DISPLAY_ID)) { String versionStr = buildProperties.getProperty(KEY_DISPLAY_ID); Matcher matcher = Pattern.compile("amigo([\\d.]+)[a-zA-Z]*").matcher(versionStr); // // "amigo3.5.1" if (!TextUtils.isEmpty(versionStr) && matcher.find()) { try { String version = matcher.group(1); rom.setVersion(version); rom.setBaseVersion(Integer.parseInt(version.split("\\.")[0])); } catch (Exception e) { e.printStackTrace(); } } } } else if (buildProperties.containsKey(KEY_SONY_PROTOCOL_TYPE) || buildProperties.containsKey(KEY_SONY_ENCRYPTED_DATA)) { // Sony rom = ROM.Sony; } else if (buildProperties.containsKey(KEY_YULONG_VERSION_RELEASE) || buildProperties.containsKey(KEY_YULONG_VERSION_TAG)) { // YuLong rom = ROM.YuLong; } else if (buildProperties.containsKey(KEY_SENSE_BUILD_STAGE) || buildProperties.containsKey(KEY_SENSE_BLUETOOTH_SAP)) { // Sense rom = ROM.Sense; } else if (buildProperties.containsKey(KEY_LG_SW_VERSION) || buildProperties.containsKey(KEY_LG_SW_VERSION_SHORT) || buildProperties.containsKey(KEY_LG_FACTORY_VERSION)) { // LG rom = ROM.LG; } else if (buildProperties.containsKey(KEY_LENOVO_DEVICE) || buildProperties.containsKey(KEY_LENOVO_PLATFORM) || buildProperties.containsKey(KEY_LENOVO_ADB)) { // Lenovo rom = ROM.Lenovo; } else if (buildProperties.containsKey(KEY_DISPLAY_ID)) { String displayId = buildProperties.getProperty(KEY_DISPLAY_ID); if (!TextUtils.isEmpty(displayId)) { if (displayId.contains(VALUE_FLYME_DISPLAY_ID_CONTAIN)) { return ROM.Flyme; } else if (displayId.contains(VALUE_AMIGO_DISPLAY_ID_CONTAIN)) { return ROM.AmigoOS; } } } else if (buildProperties.containsKey(KEY_BASE_OS_VERSION)) { String baseOsVersion = buildProperties.getProperty(KEY_BASE_OS_VERSION); if (!TextUtils.isEmpty(baseOsVersion)) { if (baseOsVersion.contains(VALUE_COLOROS_BASE_OS_VERSION_CONTAIN)) { return ROM.ColorOS; } else if (baseOsVersion.contains(VALUE_SAMSUNG_BASE_OS_VERSION_CONTAIN)) { return ROM.SamSung; } } } else if (buildProperties.containsKey(KEY_CLIENT_ID_BASE)) { String clientIdBase = buildProperties.getProperty(KEY_CLIENT_ID_BASE); switch (clientIdBase) { case VALUE_MIUI_CLIENT_ID_BASE: return ROM.MIUI; case VALUE_COLOROS_CLIENT_ID_BASE: return ROM.ColorOS; case VALUE_FUNTOUCHOS_CLIENT_ID_BASE: return ROM.FuntouchOS; case VALUE_SAMSUNG_CLIENT_ID_BASE: return ROM.SamSung; case VALUE_SONY_CLIENT_ID_BASE: return ROM.Sony; case VALUE_YULONG_CLIENT_ID_BASE: return ROM.YuLong; case VALUE_SENSE_CLIENT_ID_BASE: return ROM.Sense; case VALUE_LENOVO_CLIENT_ID_BASE: return ROM.Lenovo; case VALUE_AMIGO_CLIENT_ID_BASE: return ROM.AmigoOS; default: break; } } } catch (IOException e) { e.printStackTrace(); } finally { if (is != null) { try { is.close(); } catch (IOException e) { e.printStackTrace(); } } } return rom; } public enum ROM { MIUI, // 小米 Flyme, // 魅族 EMUI, // 华为 ColorOS, // OPPO FuntouchOS, // vivo SmartisanOS, // 锤子 EUI, // 乐视 Sense, // HTC AmigoOS, // 金立 _360OS, // 奇酷360 NubiaUI, // 努比亚 H2OS, // 一加 YunOS, // 阿里巴巴 YuLong, // 酷派 SamSung, // 三星 Sony, // 索尼 Lenovo, // 联想 LG, // LG Google, // 原生 Other; // CyanogenMod, Lewa OS, 百度云OS, Tencent OS, 深度OS, IUNI OS, Tapas OS, Mokee private int baseVersion = -1; private String version; public int getBaseVersion() { return baseVersion; } void setBaseVersion(int baseVersion) { this.baseVersion = baseVersion; } public String getVersion() { return version; } void setVersion(String version) { this.version = version; } } }
在values文件下创建ids.xml
<resources> <item name="fake_status_bar_view" type="id"/> </resources>
在需要沉浸式状态栏的地方调用如下代码即可
讯享网 //设置沉浸状态栏 StatusBarUtils.setColor(this,0x0666F8); StatusBarUtils.setTextDark(this,true);

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/37186.html