阅读 258

Android自动设置状态栏字体颜色(手机状态栏颜色)

Android4.4以上系统版本可以修改状态栏颜色,Android6.0以上系统可以把状态栏文字和图标换成深色,但是MIUI、Flyme例外

所以我们封装一个根据状态栏颜色来自动设置状态栏字体颜色

使用方法

override fun onCreate(savedInstanceState: Bundle?) {         super.onCreate(savedInstanceState)         //设置状态栏颜色         StatusBarUtils.setStatusBarLightMode(window)     } 复制代码

简单叭

效果图

在这里插入图片描述

目录结构

在这里插入图片描述

java代码

StatusBarUtils

 /**  * @author lc. 2018-09-03 23:20  * @since 0.6.0  */ public class StatusBarUtils {     /**      * 设置状态栏文字颜色为黑色      *      * @param window         window      * @param statusBarColor 状态栏的颜色      */     public static void setStatusBarLightMode(Window window, @ColorRes int statusBarColor) {         if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {             return;         }         // 状态栏文字颜色设置结果         boolean lightModeSetSuccess = true;         FitUtils.Brand brand = FitUtils.getBrand();         if (brand == FitUtils.Brand.XIAO_MI) {             // 小米 状态栏颜色             lightModeSetSuccess = setStatusBarLightModeMIUI(window, true);         } else if (brand == FitUtils.Brand.MEI_ZU) {             // 魅族 状态栏颜色             lightModeSetSuccess = setStatusBarLightModeFlyMe(window, true);         } else {             // Android 6.0 之后的原生方式             setStatusBarLightModeOrigin(window, true);         }         if (lightModeSetSuccess) {             // 黑色字体设置成功             setStatusBarColor(window, statusBarColor);         }     }     public static void setStatusBarLightMode(Window window) {         if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {             return;         }         // 状态栏文字颜色设置结果         boolean lightModeSetSuccess = true;         FitUtils.Brand brand = FitUtils.getBrand();         if (brand == FitUtils.Brand.XIAO_MI) {             // 小米 状态栏颜色             lightModeSetSuccess = setStatusBarLightModeMIUI(window, true);         } else if (brand == FitUtils.Brand.MEI_ZU) {             // 魅族 状态栏颜色             lightModeSetSuccess = setStatusBarLightModeFlyMe(window, true);         } else {             // Android 6.0 之后的原生方式             setStatusBarLightModeOrigin(window, true);         }     }     /**      * 设置状态栏文字颜色为白色      *      * @param window         window      * @param statusBarColor 状态栏的颜色      */     public static void setStatusBarDarkMode(Window window, @ColorRes int statusBarColor) {         if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {             return;         }         // 状态栏文字颜色设置结果         boolean darkModeSetSuccess = true;         FitUtils.Brand brand = FitUtils.getBrand();         if (brand == FitUtils.Brand.XIAO_MI) {             // 小米 状态栏颜色             darkModeSetSuccess = setStatusBarLightModeMIUI(window, false);         } else if (brand == FitUtils.Brand.MEI_ZU) {             // 魅族 状态栏颜色             darkModeSetSuccess = setStatusBarLightModeFlyMe(window, false);         } else {             // Android 6.0 之后的原生方式             setStatusBarLightModeOrigin(window, false);         }         setStatusBarColor(window, statusBarColor);     }     /**      * 修改状态栏颜色,支持4.4以上版本      */     public static void setStatusBarColor(Window window, @ColorRes int colorResId) {         if (window == null) {             return;         }         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {             window.setStatusBarColor(ResUtils.getColor(window.getContext(), colorResId));         }     }     /**      * 修改状态栏颜色,支持4.4以上版本      */     public static void setStatusBarColor(Activity activity, @ColorRes int colorResId) {         if (activity == null) {             return;         }         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {             activity.getWindow().setStatusBarColor(ResUtils.getColor(activity, colorResId));         } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {             SystemBarTintManager tintManager = new SystemBarTintManager(activity);             tintManager.setStatusBarTintEnabled(true);             tintManager.setStatusBarTintResource(colorResId);         }     }     /**      * 设置状态栏图标为深色和魅族特定的文字风格      * 可以用来判断是否为Flyme用户      *      * @param window    需要设置的窗口      * @param lightMode 是否把状态栏文字及图标颜色设置为深色      * @return boolean 成功执行返回true      */     private static boolean setStatusBarLightModeFlyMe(Window window, boolean lightMode) {         boolean result = false;         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 (lightMode) {                     value |= bit;                 } else {                     value &= ~bit;                 }                 meizuFlags.setInt(lp, value);                 window.setAttributes(lp);                 result = true;             } catch (Exception e) {                 e.printStackTrace();             }         }         return result;     }     /**      * 需要MIUIV6以上      *      * @param lightMode 是否把状态栏文字及图标颜色设置为深色      * @return boolean 成功执行返回true      */     private static boolean setStatusBarLightModeMIUI(Window window, boolean lightMode) {         boolean result = false;         if (window != null) {             Class clazz = window.getClass();             try {                 int lightModeFlag = 0;                 Class layoutParams = Class.forName("android.view.MiuiWindowManager$LayoutParams");                 Field field = layoutParams.getField("EXTRA_FLAG_STATUS_BAR_DARK_MODE");                 lightModeFlag = field.getInt(layoutParams);                 Method extraFlagField = clazz.getMethod("setExtraFlags", int.class, int.class);                 if (lightMode) {                     extraFlagField.invoke(window, lightModeFlag, lightModeFlag);//状态栏透明且黑色字体                 } else {                     extraFlagField.invoke(window, 0, lightModeFlag);//清除黑色字体                 }                 result = true;                 //开发版 7.7.13 及以后版本采用了系统API,旧方法无效但不会报错,所以使用原生系统方法再设置一次                 setStatusBarLightModeOrigin(window, lightMode);             } catch (Exception e) {                 e.printStackTrace();             }         }         return result;     }     /** 使用原生系统 API 来设置状态栏文字颜色 */     private static void setStatusBarLightModeOrigin(Window window, boolean lightMode) {         if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {             return;         }         View decorView = window.getDecorView();         int originVisibility = decorView.getSystemUiVisibility();         // 亮色模式,使用黑色文字         if (lightMode && (originVisibility & View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR) == 0) {             originVisibility = originVisibility | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;         }         // 暗色模式,使用白色文字         if (!lightMode && (originVisibility & View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR) != 0) {             originVisibility = originVisibility ^ View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;         }         decorView.setSystemUiVisibility(originVisibility);     } } 复制代码

SystemBarTintManager

 /*  * Copyright (C) 2013 readyState Software Ltd  *  * Licensed under the Apache License, Version 2.0 (the "License");  * you may not use this file except in compliance with the License.  * You may obtain a copy of the License at  *  *      http://www.apache.org/licenses/LICENSE-2.0  *  * Unless required by applicable law or agreed to in writing, software  * distributed under the License is distributed on an "AS IS" BASIS,  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  * See the License for the specific language governing permissions and  * limitations under the License.  */ /**  * Class to manage status and navigation bar tint effects when using KitKat  * translucent system UI modes.  */ public class SystemBarTintManager {     static {         // Android allows a system property to override the presence of the navigation bar.         // Used by the emulator.         // See https://github.com/android/platform_frameworks_base/blob/master/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java#L1076         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {             try {                 Class c = Class.forName("android.os.SystemProperties");                 Method m = c.getDeclaredMethod("get", String.class);                 m.setAccessible(true);                 sNavBarOverride = (String) m.invoke(null, "qemu.hw.mainkeys");             } catch (Throwable e) {                 sNavBarOverride = null;             }         }     }     /**      * The default system bar tint color value.      */     public static final int DEFAULT_TINT_COLOR = 0x99000000;     private static String sNavBarOverride;     private final SystemBarConfig mConfig;     private boolean mStatusBarAvailable;     private boolean mNavBarAvailable;     private boolean mStatusBarTintEnabled;     private boolean mNavBarTintEnabled;     private View mStatusBarTintView;     private View mNavBarTintView;     /**      * Constructor. Call this in the host activity onCreate method after its      * content view has been set. You should always create new instances when      * the host activity is recreated.      *      * @param activity The host activity.      */     @TargetApi(19)     public SystemBarTintManager(Activity activity) {         Window win = activity.getWindow();         ViewGroup decorViewGroup = (ViewGroup) win.getDecorView();         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {             // check theme attrs             int[] attrs = {android.R.attr.windowTranslucentStatus,                     android.R.attr.windowTranslucentNavigation};             TypedArray a = activity.obtainStyledAttributes(attrs);             try {                 mStatusBarAvailable = a.getBoolean(0, false);                 mNavBarAvailable = a.getBoolean(1, false);             } finally {                 a.recycle();             }             // check window flags             WindowManager.LayoutParams winParams = win.getAttributes();             int bits = WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;             if ((winParams.flags & bits) != 0) {                 mStatusBarAvailable = true;             }             bits = WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION;             if ((winParams.flags & bits) != 0) {                 mNavBarAvailable = true;             }         }         mConfig = new SystemBarConfig(activity, mStatusBarAvailable, mNavBarAvailable);         // device might not have virtual navigation keys         if (!mConfig.hasNavigtionBar()) {             mNavBarAvailable = false;         }         if (mStatusBarAvailable) {             setupStatusBarView(activity, decorViewGroup);         }         if (mNavBarAvailable) {             setupNavBarView(activity, decorViewGroup);         }     }     /**      * Enable tinting of the system status bar.      *      * If the platform is running Jelly Bean or earlier, or translucent system      * UI modes have not been enabled in either the theme or via window flags,      * then this method does nothing.      *      * @param enabled True to enable tinting, false to disable it (default).      */     public void setStatusBarTintEnabled(boolean enabled) {         mStatusBarTintEnabled = enabled;         if (mStatusBarAvailable) {             mStatusBarTintView.setVisibility(enabled ? View.VISIBLE : View.GONE);         }     }     /**      * Enable tinting of the system navigation bar.      *      * If the platform does not have soft navigation keys, is running Jelly Bean      * or earlier, or translucent system UI modes have not been enabled in either      * the theme or via window flags, then this method does nothing.      *      * @param enabled True to enable tinting, false to disable it (default).      */     public void setNavigationBarTintEnabled(boolean enabled) {         mNavBarTintEnabled = enabled;         if (mNavBarAvailable) {             mNavBarTintView.setVisibility(enabled ? View.VISIBLE : View.GONE);         }     }     /**      * Apply the specified color tint to all system UI bars.      *      * @param color The color of the background tint.      */     public void setTintColor(int color) {         setStatusBarTintColor(color);         setNavigationBarTintColor(color);     }     /**      * Apply the specified drawable or color resource to all system UI bars.      *      * @param res The identifier of the resource.      */     public void setTintResource(int res) {         setStatusBarTintResource(res);         setNavigationBarTintResource(res);     }     /**      * Apply the specified drawable to all system UI bars.      *      * @param drawable The drawable to use as the background, or null to remove it.      */     public void setTintDrawable(Drawable drawable) {         setStatusBarTintDrawable(drawable);         setNavigationBarTintDrawable(drawable);     }     /**      * Apply the specified alpha to all system UI bars.      *      * @param alpha The alpha to use      */     public void setTintAlpha(float alpha) {         setStatusBarAlpha(alpha);         setNavigationBarAlpha(alpha);     }     /**      * Apply the specified color tint to the system status bar.      *      * @param color The color of the background tint.      */     public void setStatusBarTintColor(int color) {         if (mStatusBarAvailable) {             mStatusBarTintView.setBackgroundColor(color);         }     }     /**      * Apply the specified drawable or color resource to the system status bar.      *      * @param res The identifier of the resource.      */     public void setStatusBarTintResource(int res) {         if (mStatusBarAvailable) {             mStatusBarTintView.setBackgroundResource(res);         }     }     /**      * Apply the specified drawable to the system status bar.      *      * @param drawable The drawable to use as the background, or null to remove it.      */     @SuppressWarnings("deprecation")     public void setStatusBarTintDrawable(Drawable drawable) {         if (mStatusBarAvailable) {             mStatusBarTintView.setBackgroundDrawable(drawable);         }     }     /**      * Apply the specified alpha to the system status bar.      *      * @param alpha The alpha to use      */     @TargetApi(11)     public void setStatusBarAlpha(float alpha) {         if (mStatusBarAvailable && Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {             mStatusBarTintView.setAlpha(alpha);         }     }     /**      * Apply the specified color tint to the system navigation bar.      *      * @param color The color of the background tint.      */     public void setNavigationBarTintColor(int color) {         if (mNavBarAvailable) {             mNavBarTintView.setBackgroundColor(color);         }     }     /**      * Apply the specified drawable or color resource to the system navigation bar.      *      * @param res The identifier of the resource.      */     public void setNavigationBarTintResource(int res) {         if (mNavBarAvailable) {             mNavBarTintView.setBackgroundResource(res);         }     }     /**      * Apply the specified drawable to the system navigation bar.      *      * @param drawable The drawable to use as the background, or null to remove it.      */     @SuppressWarnings("deprecation")     public void setNavigationBarTintDrawable(Drawable drawable) {         if (mNavBarAvailable) {             mNavBarTintView.setBackgroundDrawable(drawable);         }     }     /**      * Apply the specified alpha to the system navigation bar.      *      * @param alpha The alpha to use      */     @TargetApi(11)     public void setNavigationBarAlpha(float alpha) {         if (mNavBarAvailable && Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {             mNavBarTintView.setAlpha(alpha);         }     }     /**      * Get the system bar configuration.      *      * @return The system bar configuration for the current device configuration.      */     public SystemBarConfig getConfig() {         return mConfig;     }     /**      * Is tinting enabled for the system status bar?      *      * @return True if enabled, False otherwise.      */     public boolean isStatusBarTintEnabled() {         return mStatusBarTintEnabled;     }     /**      * Is tinting enabled for the system navigation bar?      *      * @return True if enabled, False otherwise.      */     public boolean isNavBarTintEnabled() {         return mNavBarTintEnabled;     }     private void setupStatusBarView(Context context, ViewGroup decorViewGroup) {         mStatusBarTintView = new View(context);         LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT, mConfig.getStatusBarHeight());         params.gravity = Gravity.TOP;         if (mNavBarAvailable && !mConfig.isNavigationAtBottom()) {             params.rightMargin = mConfig.getNavigationBarWidth();         }         mStatusBarTintView.setLayoutParams(params);         mStatusBarTintView.setBackgroundColor(DEFAULT_TINT_COLOR);         mStatusBarTintView.setVisibility(View.GONE);         decorViewGroup.addView(mStatusBarTintView);     }     private void setupNavBarView(Context context, ViewGroup decorViewGroup) {         mNavBarTintView = new View(context);         LayoutParams params;         if (mConfig.isNavigationAtBottom()) {             params = new LayoutParams(LayoutParams.MATCH_PARENT, mConfig.getNavigationBarHeight());             params.gravity = Gravity.BOTTOM;         } else {             params = new LayoutParams(mConfig.getNavigationBarWidth(), LayoutParams.MATCH_PARENT);             params.gravity = Gravity.RIGHT;         }         mNavBarTintView.setLayoutParams(params);         mNavBarTintView.setBackgroundColor(DEFAULT_TINT_COLOR);         mNavBarTintView.setVisibility(View.GONE);         decorViewGroup.addView(mNavBarTintView);     }     /**      * Class which describes system bar sizing and other characteristics for the current      * device configuration.      */     public static class SystemBarConfig {         private static final String STATUS_BAR_HEIGHT_RES_NAME = "status_bar_height";         private static final String NAV_BAR_HEIGHT_RES_NAME = "navigation_bar_height";         private static final String NAV_BAR_HEIGHT_LANDSCAPE_RES_NAME = "navigation_bar_height_landscape";         private static final String NAV_BAR_WIDTH_RES_NAME = "navigation_bar_width";         private static final String SHOW_NAV_BAR_RES_NAME = "config_showNavigationBar";         private final boolean mTranslucentStatusBar;         private final boolean mTranslucentNavBar;         private final int mStatusBarHeight;         private final int mActionBarHeight;         private final boolean mHasNavigationBar;         private final int mNavigationBarHeight;         private final int mNavigationBarWidth;         private final boolean mInPortrait;         private final float mSmallestWidthDp;         private SystemBarConfig(Activity activity, boolean translucentStatusBar, boolean traslucentNavBar) {             Resources res = activity.getResources();             mInPortrait = (res.getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT);             mSmallestWidthDp = getSmallestWidthDp(activity);             mStatusBarHeight = getInternalDimensionSize(res, STATUS_BAR_HEIGHT_RES_NAME);             mActionBarHeight = getActionBarHeight(activity);             mNavigationBarHeight = getNavigationBarHeight(activity);             mNavigationBarWidth = getNavigationBarWidth(activity);             mHasNavigationBar = (mNavigationBarHeight > 0);             mTranslucentStatusBar = translucentStatusBar;             mTranslucentNavBar = traslucentNavBar;         }         @TargetApi(14)         private int getActionBarHeight(Context context) {             int result = 0;             if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {                 TypedValue tv = new TypedValue();                 context.getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true);                 result = TypedValue.complexToDimensionPixelSize(tv.data, context.getResources().getDisplayMetrics());             }             return result;         }         @TargetApi(14)         private int getNavigationBarHeight(Context context) {             Resources res = context.getResources();             int result = 0;             if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {                 if (hasNavBar(context)) {                     String key;                     if (mInPortrait) {                         key = NAV_BAR_HEIGHT_RES_NAME;                     } else {                         key = NAV_BAR_HEIGHT_LANDSCAPE_RES_NAME;                     }                     return getInternalDimensionSize(res, key);                 }             }             return result;         }         @TargetApi(14)         private int getNavigationBarWidth(Context context) {             Resources res = context.getResources();             int result = 0;             if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {                 if (hasNavBar(context)) {                     return getInternalDimensionSize(res, NAV_BAR_WIDTH_RES_NAME);                 }             }             return result;         }         @TargetApi(14)         private boolean hasNavBar(Context context) {             Resources res = context.getResources();             int resourceId = res.getIdentifier(SHOW_NAV_BAR_RES_NAME, "bool", "android");             if (resourceId != 0) {                 boolean hasNav = res.getBoolean(resourceId);                 // check override flag (see static block)                 if ("1".equals(sNavBarOverride)) {                     hasNav = false;                 } else if ("0".equals(sNavBarOverride)) {                     hasNav = true;                 }                 return hasNav;             } else { // fallback                 return !ViewConfiguration.get(context).hasPermanentMenuKey();             }         }         private int getInternalDimensionSize(Resources res, String key) {             int result = 0;             int resourceId = res.getIdentifier(key, "dimen", "android");             if (resourceId > 0) {                 result = res.getDimensionPixelSize(resourceId);             }             return result;         }         @SuppressLint("NewApi")         private float getSmallestWidthDp(Activity activity) {             DisplayMetrics metrics = new DisplayMetrics();             if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {                 activity.getWindowManager().getDefaultDisplay().getRealMetrics(metrics);             } else {                 // TODO this is not correct, but we don't really care pre-kitkat                 activity.getWindowManager().getDefaultDisplay().getMetrics(metrics);             }             float widthDp = metrics.widthPixels / metrics.density;             float heightDp = metrics.heightPixels / metrics.density;             return Math.min(widthDp, heightDp);         }         /**          * Should a navigation bar appear at the bottom of the screen in the current          * device configuration? A navigation bar may appear on the right side of          * the screen in certain configurations.          *          * @return True if navigation should appear at the bottom of the screen, False otherwise.          */         public boolean isNavigationAtBottom() {             return (mSmallestWidthDp >= 600 || mInPortrait);         }         /**          * Get the height of the system status bar.          *          * @return The height of the status bar (in pixels).          */         public int getStatusBarHeight() {             return mStatusBarHeight;         }         /**          * Get the height of the action bar.          *          * @return The height of the action bar (in pixels).          */         public int getActionBarHeight() {             return mActionBarHeight;         }         /**          * Does this device have a system navigation bar?          *          * @return True if this device uses soft key navigation, False otherwise.          */         public boolean hasNavigtionBar() {             return mHasNavigationBar;         }         /**          * Get the height of the system navigation bar.          *          * @return The height of the navigation bar (in pixels). If the device does not have          * soft navigation keys, this will always return 0.          */         public int getNavigationBarHeight() {             return mNavigationBarHeight;         }         /**          * Get the width of the system navigation bar when it is placed vertically on the screen.          *          * @return The width of the navigation bar (in pixels). If the device does not have          * soft navigation keys, this will always return 0.          */         public int getNavigationBarWidth() {             return mNavigationBarWidth;         }         /**          * Get the layout inset for any system UI that appears at the top of the screen.          *          * @param withActionBar True to include the height of the action bar, False otherwise.          *          * @return The layout inset (in pixels).          */         public int getPixelInsetTop(boolean withActionBar) {             return (mTranslucentStatusBar ? mStatusBarHeight : 0) + (withActionBar ? mActionBarHeight : 0);         }         /**          * Get the layout inset for any system UI that appears at the bottom of the screen.          *          * @return The layout inset (in pixels).          */         public int getPixelInsetBottom() {             if (mTranslucentNavBar && isNavigationAtBottom()) {                 return mNavigationBarHeight;             } else {                 return 0;             }         }         /**          * Get the layout inset for any system UI that appears at the right of the screen.          *          * @return The layout inset (in pixels).          */         public int getPixelInsetRight() {             if (mTranslucentNavBar && !isNavigationAtBottom()) {                 return mNavigationBarWidth;             } else {                 return 0;             }         }     } } 复制代码

设置颜色工具ResUtils

 public class ResUtils {     public static int getInteger(Context context, @IntegerRes int resId) {         return context.getResources().getInteger(resId);     }     public static String getString(Context context, @StringRes int strId) {         return context.getResources().getString(strId);     }     public static String getString(Context context, @StringRes int strId, Object... formatArgs) {         return context.getResources().getString(strId, formatArgs);     }     public static int getColor(Context context, @ColorRes int colorResId) {         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {             return context.getColor(colorResId);         } else {             return context.getResources().getColor(colorResId);         }     }     public static Drawable getDrawable(Context context, @DrawableRes int resId) {         try {             return AppCompatResources.getDrawable(context, resId);         } catch (Exception e) {             e.printStackTrace();         }         return null;     } } 复制代码

手机品牌——FitUtils

 public class FitUtils {     /** 手机品牌枚举 */     public enum Brand {         // 未知品牌         UNKNOWN,         // 华为         HUAWEI,         // 小米         XIAO_MI,         // vivo         VIVO,         // oppo         OPPO,         // 魅族         MEI_ZU,         // 三星         SAMSUNG,         // 诺基亚         NOKIA,         // google 亲儿子         NEXUS,     }     /** 返回手机系统的品牌 */     public static Brand getBrand() {         Brand brand;         String brandString = Build.BRAND;         if (TextUtils.isEmpty(brandString)) {             return Brand.UNKNOWN;         }         switch (brandString.toLowerCase()) {             case "huawei":                 return Brand.HUAWEI;             case "xiaomi":                 return Brand.XIAO_MI;             case "vivo":                 return Brand.VIVO;             case "oppo":                 return Brand.OPPO;             case "meizu":                 return Brand.MEI_ZU;             case "samsung":                 return Brand.SAMSUNG;             case "google":                 return Brand.NEXUS;             case "nokia":                 return Brand.NOKIA;             default:                 return Brand.UNKNOWN;         }     }     /** 返回手机屏幕是否带有刘海 */     public static boolean isWindowHasFringe(Context context) {         Brand brand = getBrand();         switch (brand) {             case XIAO_MI:                 return isWindowHasFringeXiaoMi();             case OPPO:                 return isWindowHasFringeOppo(context);             case VIVO:                 return isWindowHasFringeVivo();             case HUAWEI:                 return isWindowHasFringeHuawei(context);             default:                 return false;         }     }     /**      * 小米手机是否有刘海      * https://dev.mi.com/console/doc/detail?pId=1293      */     private static boolean isWindowHasFringeXiaoMi() {         try {             Class<?> systemPropertiesCls = Class.forName("android.os.SystemProperties");             Method getIntMethod = systemPropertiesCls.getMethod("getInt", new Class[]{String.class, int.class});             int value = (int) getIntMethod.invoke(null, "ro.miui.notch", 0);             return value == 1;         } catch (Exception e) {             // no-op         }         return false;     }     /**      * Vivo 手机是否有刘海      *      * 参考文档 https://swsdl.vivo.com.cn/appstore/developer/uploadfile/20180328/20180328152252602.pdf      */     private static boolean isWindowHasFringeVivo() {         try {             Class cls = Class.forName("android.util.FtFeature");             Method method = cls.getMethod("isFeatureSupport", int.class);             return (boolean) method.invoke(null, 0x00000020);         } catch (Exception e) {             // no-op         }         return false;     }     /**      * Oppo 手机是否有刘海      *      * 参考文档 https://open.oppomobile.com/wiki/doc#id=10139      */     private static boolean isWindowHasFringeOppo(Context context) {         try {             return context.getPackageManager().hasSystemFeature("com.oppo.feature.screen.heteromorphism");         } catch (Exception e) {             // no-op         }         return false;     }     /**      * 华为手机是否有刘海      *      * 参考 https://blog.csdn.net/li15225271052/article/details/79967647      */     private static boolean isWindowHasFringeHuawei(Context context) {         try {             ClassLoader classLoader = context.getClassLoader();             Class cls = classLoader.loadClass("com.huawei.android.util.HwNotchSizeUtil");             Method method = cls.getMethod("hasNotchInScreen");             return (boolean) method.invoke(cls);         } catch (Exception e) {             // no-op         }         return false;     } }


作者:九狼
链接:https://juejin.cn/post/7047046860669714469

文章分类
ANDROID
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐