• Android 沉浸式状态栏(全透明状态栏)全适配方案。解决透明状态栏后依然有半透明灰色问题。


    可以适配Android 11的沉浸式。状态栏完全透明,没有半透明灰色。

    1. package com.iflytek.jzapp.utils.immersive;
    2. import android.app.Activity;
    3. import android.graphics.Color;
    4. import android.os.Build;
    5. import android.view.Gravity;
    6. import android.view.View;
    7. import android.view.ViewGroup;
    8. import android.view.Window;
    9. import android.view.WindowManager;
    10. import android.widget.FrameLayout;
    11. import androidx.appcompat.app.AppCompatActivity;
    12. import androidx.core.view.ViewCompat;
    13. /**
    14. * @author:luck
    15. * @data:2018/3/28 下午1:00
    16. * @描述: 沉浸式相关
    17. */
    18. public class ImmersiveManager {
    19. /**
    20. * 注意:使用最好将布局xml 跟布局加入 android:fitsSystemWindows="true" ,这样可以避免有些手机上布局顶边的问题
    21. *
    22. * @param baseActivity 这个会留出来状态栏和底栏的空白
    23. * @param statusBarColor 状态栏的颜色
    24. * @param navigationBarColor 导航栏的颜色
    25. * @param isDarkStatusBarIcon 状态栏图标颜色是否是深(黑)色 false状态栏图标颜色为白色
    26. */
    27. public static void immersiveAboveAPI23(AppCompatActivity baseActivity, int statusBarColor, int navigationBarColor, boolean isDarkStatusBarIcon) {
    28. immersiveAboveAPI23(baseActivity, false, false, statusBarColor, navigationBarColor, isDarkStatusBarIcon);
    29. }
    30. /**
    31. * @param baseActivity
    32. * @param statusBarColor 状态栏的颜色
    33. * @param navigationBarColor 导航栏的颜色
    34. */
    35. public static void immersiveAboveAPI23(AppCompatActivity baseActivity, boolean isMarginStatusBar
    36. , boolean isMarginNavigationBar, int statusBarColor, int navigationBarColor, boolean isDarkStatusBarIcon) {
    37. try {
    38. Window window = baseActivity.getWindow();
    39. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT && Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
    40. //4.4版本及以上 5.0版本及以下
    41. if (isDarkStatusBarIcon) {
    42. initBarBelowLOLLIPOP(baseActivity);
    43. } else {
    44. window.setFlags(
    45. WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,
    46. WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
    47. }
    48. } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    49. if (isMarginStatusBar && isMarginNavigationBar) {
    50. //5.0版本及以上
    51. window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS
    52. | WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
    53. LightStatusBarUtils.setLightStatusBar(baseActivity, true
    54. , true
    55. , statusBarColor == Color.TRANSPARENT
    56. , isDarkStatusBarIcon);
    57. window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
    58. } else if (!isMarginStatusBar && !isMarginNavigationBar) {
    59. if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M && isDarkStatusBarIcon) {
    60. initBarBelowLOLLIPOP(baseActivity);
    61. } else {
    62. window.requestFeature(Window.FEATURE_NO_TITLE);
    63. window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS
    64. | WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
    65. LightStatusBarUtils.setLightStatusBar(baseActivity, false
    66. , false
    67. , statusBarColor == Color.TRANSPARENT
    68. , isDarkStatusBarIcon);
    69. window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
    70. }
    71. } else if (!isMarginStatusBar) {
    72. window.requestFeature(Window.FEATURE_NO_TITLE);
    73. window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS
    74. | WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
    75. LightStatusBarUtils.setLightStatusBar(baseActivity, false
    76. , true
    77. , statusBarColor == Color.TRANSPARENT
    78. , isDarkStatusBarIcon);
    79. window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
    80. } else {
    81. //留出来状态栏 不留出来导航栏 没找到办法。。
    82. return;
    83. }
    84. window.setStatusBarColor(statusBarColor);
    85. window.setNavigationBarColor(navigationBarColor);
    86. }
    87. } catch (Exception e) {
    88. e.printStackTrace();
    89. }
    90. }
    91. private final static String TAG_FAKE_STATUS_BAR_VIEW = "TAG_FAKE_STATUS_BAR_VIEW";
    92. private final static String TAG_MARGIN_ADDED = "TAG_MARGIN_ADDED";
    93. private final static String TAG_NAVIGATION_BAR_VIEW = "TAG_NAVIGATION_BAR_VIEW";
    94. /**
    95. * 透明状态栏
    96. *
    97. * @param activity
    98. * @param isDarkStatusBarBlack
    99. */
    100. public static void translucentStatusBar(Activity activity, boolean isDarkStatusBarBlack) {
    101. Window window = activity.getWindow();
    102. //添加Flag把状态栏设为可绘制模式
    103. window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
    104. //如果为全透明模式,取消设置Window半透明的Flag
    105. window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
    106. //设置状态栏为透明
    107. window.setStatusBarColor(Color.TRANSPARENT);
    108. View decor = window.getDecorView();
    109. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    110. //设置window的状态栏不可见,且状态栏字体是白色
    111. if (isDarkStatusBarBlack) {
    112. decor.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR | View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
    113. } else {
    114. window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
    115. }
    116. } else {
    117. //初始化5.0以下,4.4以上沉浸式
    118. if (isDarkStatusBarBlack) {
    119. initBarBelowLOLLIPOP(activity);
    120. } else {
    121. window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
    122. }
    123. }
    124. //view不根据系统窗口来调整自己的布局
    125. ViewGroup mContentView = window.findViewById(Window.ID_ANDROID_CONTENT);
    126. View mChildView = mContentView.getChildAt(0);
    127. if (mChildView != null) {
    128. mChildView.setFitsSystemWindows(false);
    129. ViewCompat.requestApplyInsets(mChildView);
    130. }
    131. }
    132. private static void initBarBelowLOLLIPOP(Activity activity) {
    133. //透明状态栏
    134. Window mWindow = activity.getWindow();
    135. mWindow.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
    136. //创建一个假的状态栏
    137. setupStatusBarView(activity);
    138. //判断是否存在导航栏,是否禁止设置导航栏
    139. if (DensityUtil.isNavBarVisible(activity)) {
    140. //透明导航栏,设置这个,如果有导航栏,底部布局会被导航栏遮住
    141. mWindow.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
    142. //创建一个假的导航栏
    143. setupNavBarView(activity);
    144. }
    145. }
    146. private static void setupStatusBarView(Activity activity) {
    147. Window mWindow = activity.getWindow();
    148. View statusBarView = mWindow.getDecorView().findViewWithTag(TAG_FAKE_STATUS_BAR_VIEW);
    149. if (statusBarView == null) {
    150. statusBarView = new View(activity);
    151. FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT,
    152. DensityUtil.getStatusBarHeight(activity));
    153. params.gravity = Gravity.TOP;
    154. statusBarView.setLayoutParams(params);
    155. statusBarView.setVisibility(View.VISIBLE);
    156. statusBarView.setTag(TAG_MARGIN_ADDED);
    157. ((ViewGroup) mWindow.getDecorView()).addView(statusBarView);
    158. }
    159. statusBarView.setBackgroundColor(Color.TRANSPARENT);
    160. }
    161. private static void setupNavBarView(Activity activity) {
    162. Window window = activity.getWindow();
    163. View navigationBarView = window.getDecorView().findViewWithTag(TAG_NAVIGATION_BAR_VIEW);
    164. if (navigationBarView == null) {
    165. navigationBarView = new View(activity);
    166. navigationBarView.setTag(TAG_NAVIGATION_BAR_VIEW);
    167. ((ViewGroup) window.getDecorView()).addView(navigationBarView);
    168. }
    169. FrameLayout.LayoutParams params;
    170. if (DensityUtil.isNavigationAtBottom(activity)) {
    171. params = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, DensityUtil.getNavigationBarHeight(activity));
    172. params.gravity = Gravity.BOTTOM;
    173. } else {
    174. params = new FrameLayout.LayoutParams(DensityUtil.getNavigationBarWidth(activity), FrameLayout.LayoutParams.MATCH_PARENT);
    175. params.gravity = Gravity.END;
    176. }
    177. navigationBarView.setLayoutParams(params);
    178. navigationBarView.setBackgroundColor(Color.TRANSPARENT);
    179. navigationBarView.setVisibility(View.VISIBLE);
    180. }
    181. }
    1. package com.iflytek.jzapp.utils.immersive;
    2. import android.annotation.TargetApi;
    3. import android.app.Activity;
    4. import android.os.Build;
    5. import android.view.View;
    6. import android.view.Window;
    7. import android.view.WindowManager;
    8. import java.lang.reflect.Field;
    9. import java.lang.reflect.Method;
    10. /**
    11. * @author:luck
    12. * @data:2018/3/28 下午1:01
    13. * @描述: 沉浸式
    14. */
    15. public class LightStatusBarUtils {
    16. public static void setLightStatusBarAboveAPI23(Activity activity, boolean isMarginStatusBar
    17. , boolean isMarginNavigationBar, boolean isTransStatusBar, boolean dark) {
    18. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    19. setLightStatusBar(activity, isMarginStatusBar, isMarginNavigationBar, isTransStatusBar, dark);
    20. }
    21. }
    22. public static void setLightStatusBar(Activity activity, boolean dark) {
    23. setLightStatusBar(activity, false, false, false, dark);
    24. }
    25. public static void setLightStatusBar(Activity activity, boolean isMarginStatusBar
    26. , boolean isMarginNavigationBar, boolean isTransStatusBar, boolean dark) {
    27. switch (RomUtils.getLightStatausBarAvailableRomType()) {
    28. case RomUtils.AvailableRomType.MIUI:
    29. if (RomUtils.getMIUIVersionCode() >= 7) {
    30. setAndroidNativeLightStatusBar(activity, isMarginStatusBar, isMarginNavigationBar, isTransStatusBar, dark);
    31. } else {
    32. setMIUILightStatusBar(activity, isMarginStatusBar, isMarginNavigationBar, isTransStatusBar, dark);
    33. }
    34. break;
    35. case RomUtils.AvailableRomType.FLYME:
    36. setFlymeLightStatusBar(activity, isMarginStatusBar, isMarginNavigationBar, isTransStatusBar, dark);
    37. break;
    38. case RomUtils.AvailableRomType.ANDROID_NATIVE:
    39. setAndroidNativeLightStatusBar(activity, isMarginStatusBar, isMarginNavigationBar, isTransStatusBar, dark);
    40. break;
    41. case RomUtils.AvailableRomType.NA:
    42. // N/A do nothing
    43. break;
    44. }
    45. }
    46. private static boolean setMIUILightStatusBar(Activity activity, boolean isMarginStatusBar
    47. , boolean isMarginNavigationBar, boolean isTransStatusBar, boolean darkmode) {
    48. initStatusBarStyle(activity, isMarginStatusBar, isMarginNavigationBar);
    49. Class<? extends Window> clazz = activity.getWindow().getClass();
    50. try {
    51. int darkModeFlag = 0;
    52. Class<?> layoutParams = Class.forName("android.view.MiuiWindowManager$LayoutParams");
    53. Field field = layoutParams.getField("EXTRA_FLAG_STATUS_BAR_DARK_MODE");
    54. darkModeFlag = field.getInt(layoutParams);
    55. Method extraFlagField = clazz.getMethod("setExtraFlags", int.class, int.class);
    56. extraFlagField.invoke(activity.getWindow(), darkmode ? darkModeFlag : 0, darkModeFlag);
    57. return true;
    58. } catch (Exception e) {
    59. setAndroidNativeLightStatusBar(activity, isMarginStatusBar, isMarginNavigationBar, isTransStatusBar, darkmode);
    60. }
    61. return false;
    62. }
    63. private static boolean setFlymeLightStatusBar(Activity activity, boolean isMarginStatusBar
    64. , boolean isMarginNavigationBar, boolean isTransStatusBar, boolean dark) {
    65. boolean result = false;
    66. if (activity != null) {
    67. initStatusBarStyle(activity, isMarginStatusBar, isMarginNavigationBar);
    68. try {
    69. WindowManager.LayoutParams lp = activity.getWindow().getAttributes();
    70. Field darkFlag = WindowManager.LayoutParams.class
    71. .getDeclaredField("MEIZU_FLAG_DARK_STATUS_BAR_ICON");
    72. Field meizuFlags = WindowManager.LayoutParams.class
    73. .getDeclaredField("meizuFlags");
    74. darkFlag.setAccessible(true);
    75. meizuFlags.setAccessible(true);
    76. int bit = darkFlag.getInt(null);
    77. int value = meizuFlags.getInt(lp);
    78. if (dark) {
    79. value |= bit;
    80. } else {
    81. value &= ~bit;
    82. }
    83. meizuFlags.setInt(lp, value);
    84. activity.getWindow().setAttributes(lp);
    85. result = true;
    86. if (RomUtils.getFlymeVersion() >= 7) {
    87. setAndroidNativeLightStatusBar(activity, isMarginStatusBar, isMarginNavigationBar, isTransStatusBar, dark);
    88. }
    89. } catch (Exception e) {
    90. setAndroidNativeLightStatusBar(activity, isMarginStatusBar, isMarginNavigationBar, isTransStatusBar, dark);
    91. }
    92. }
    93. return result;
    94. }
    95. @TargetApi(11)
    96. private static void setAndroidNativeLightStatusBar(Activity activity, boolean isMarginStatusBar
    97. , boolean isMarginNavigationBar, boolean isTransStatusBar, boolean isDarkStatusBarIcon) {
    98. try {
    99. if (isTransStatusBar) {
    100. Window window = activity.getWindow();
    101. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    102. if (isMarginStatusBar && isMarginNavigationBar) {
    103. //5.0版本及以上
    104. if (isDarkStatusBarIcon && Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    105. window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE
    106. | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
    107. } else {
    108. window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
    109. }
    110. } else if (!isMarginStatusBar && !isMarginNavigationBar) {
    111. if (isDarkStatusBarIcon && Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    112. window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
    113. // | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
    114. | View.SYSTEM_UI_FLAG_LAYOUT_STABLE
    115. | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
    116. } else {
    117. window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
    118. // | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
    119. | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
    120. }
    121. } else if (!isMarginStatusBar && isMarginNavigationBar) {
    122. if (isDarkStatusBarIcon && Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    123. window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
    124. | View.SYSTEM_UI_FLAG_LAYOUT_STABLE
    125. | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
    126. } else {
    127. window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
    128. | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
    129. }
    130. } else {
    131. //留出来状态栏 不留出来导航栏 没找到办法。。
    132. return;
    133. }
    134. }
    135. } else {
    136. View decor = activity.getWindow().getDecorView();
    137. if (isDarkStatusBarIcon && Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    138. decor.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
    139. } else {
    140. // We want to change tint color to white again.
    141. // You can also record the flags in advance so that you can turn UI back completely if
    142. // you have set other flags before, such as translucent or full screen.
    143. decor.setSystemUiVisibility(0);
    144. }
    145. }
    146. } catch (Exception e) {
    147. }
    148. }
    149. private static void initStatusBarStyle(Activity activity, boolean isMarginStatusBar
    150. , boolean isMarginNavigationBar) {
    151. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
    152. if (isMarginStatusBar && isMarginNavigationBar) {
    153. activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
    154. } else if (!isMarginStatusBar && !isMarginNavigationBar) {
    155. activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
    156. | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
    157. } else if (!isMarginStatusBar && isMarginNavigationBar) {
    158. activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
    159. | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
    160. } else {
    161. //留出来状态栏 不留出来导航栏 没找到办法。。
    162. }
    163. }
    164. }
    165. }
    1. package com.iflytek.jzapp.utils.immersive;
    2. import android.annotation.SuppressLint;
    3. import android.annotation.TargetApi;
    4. import android.app.Activity;
    5. import android.content.Context;
    6. import android.content.res.Configuration;
    7. import android.content.res.Resources;
    8. import android.graphics.Point;
    9. import android.os.Build;
    10. import android.provider.Settings;
    11. import android.util.DisplayMetrics;
    12. import android.view.View;
    13. import android.view.ViewGroup;
    14. import android.view.Window;
    15. import android.view.WindowManager;
    16. /**
    17. * @author:luck
    18. * @date:2021/11/17 11:48 上午
    19. * @describe:DensityUtil
    20. */
    21. public class DensityUtil {
    22. /**
    23. * 获取屏幕真实宽度
    24. *
    25. * @param context
    26. * @return
    27. */
    28. public static int getRealScreenWidth(Context context) {
    29. WindowManager wm = (WindowManager) context.getApplicationContext().getSystemService(Context.WINDOW_SERVICE);
    30. Point point = new Point();
    31. wm.getDefaultDisplay().getRealSize(point);
    32. return point.x;
    33. }
    34. /**
    35. * 获取屏幕真实高度
    36. *
    37. * @param context
    38. * @return
    39. */
    40. public static int getRealScreenHeight(Context context) {
    41. WindowManager wm = (WindowManager) context.getApplicationContext().getSystemService(Context.WINDOW_SERVICE);
    42. Point point = new Point();
    43. wm.getDefaultDisplay().getRealSize(point);
    44. return point.y;
    45. }
    46. /**
    47. * 获取屏幕高度(不包含状态栏高度)
    48. *
    49. * @param context
    50. * @return
    51. */
    52. public static int getScreenHeight(Context context) {
    53. return getRealScreenHeight(context) - getStatusNavigationBarHeight(context);
    54. }
    55. /**
    56. * 获取状态栏和导航栏高度
    57. *
    58. * @param context
    59. * @return
    60. */
    61. private static int getStatusNavigationBarHeight(Context context) {
    62. if (isNavBarVisible(context)) {
    63. return getStatusBarHeight(context) + getNavigationBarHeight(context);
    64. } else {
    65. return getStatusBarHeight(context);
    66. }
    67. }
    68. /**
    69. * 获取状态栏高度
    70. */
    71. public static int getStatusBarHeight(Context context) {
    72. int result = 0;
    73. int resourceId = Resources.getSystem().getIdentifier("status_bar_height", "dimen", "android");
    74. if (resourceId > 0) {
    75. result = context.getResources().getDimensionPixelSize(resourceId);
    76. }
    77. return result == 0 ? dip2px(context, 26) : result;
    78. }
    79. /**
    80. * Return whether the navigation bar visible.
    81. * <p>Call it in onWindowFocusChanged will get right result.</p>
    82. *
    83. * @param
    84. * @return {@code true}: yes<br>{@code false}: no
    85. */
    86. public static boolean isNavBarVisible(Context context) {
    87. boolean isVisible = false;
    88. if (!(context instanceof Activity)) {
    89. return false;
    90. }
    91. Activity activity = (Activity) context;
    92. Window window = activity.getWindow();
    93. ViewGroup decorView = (ViewGroup) window.getDecorView();
    94. for (int i = 0, count = decorView.getChildCount(); i < count; i++) {
    95. final View child = decorView.getChildAt(i);
    96. final int id = child.getId();
    97. if (id != View.NO_ID) {
    98. String resourceEntryName = getResNameById(activity, id);
    99. if ("navigationBarBackground".equals(resourceEntryName)
    100. && child.getVisibility() == View.VISIBLE) {
    101. isVisible = true;
    102. break;
    103. }
    104. }
    105. }
    106. if (isVisible) {
    107. // 对于三星手机,android10以下非OneUI2的版本,比如 s8,note8 等设备上,
    108. // 导航栏显示存在bug:"当用户隐藏导航栏时显示输入法的时候导航栏会跟随显示",会导致隐藏输入法之后判断错误
    109. // 这个问题在 OneUI 2 & android 10 版本已修复
    110. if (RomUtils.isSamsung()
    111. && Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1
    112. && Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {
    113. try {
    114. return Settings.Global.getInt(activity.getContentResolver(), "navigationbar_hide_bar_enabled") == 0;
    115. } catch (Exception ignore) {
    116. }
    117. }
    118. int visibility = decorView.getSystemUiVisibility();
    119. isVisible = (visibility & View.SYSTEM_UI_FLAG_HIDE_NAVIGATION) == 0;
    120. }
    121. return isVisible;
    122. }
    123. /**
    124. * getResNameById
    125. *
    126. * @param context
    127. * @param id
    128. * @return
    129. */
    130. private static String getResNameById(Context context, int id) {
    131. try {
    132. return context.getResources().getResourceEntryName(id);
    133. } catch (Exception ignore) {
    134. return "";
    135. }
    136. }
    137. /**
    138. * 获取导航栏宽度
    139. *
    140. * @param context
    141. * @return
    142. */
    143. @TargetApi(14)
    144. public static int getNavigationBarWidth(Context context) {
    145. int result = 0;
    146. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
    147. if (isNavBarVisible(context)) {
    148. return getInternalDimensionSize(context, "navigation_bar_width");
    149. }
    150. }
    151. return result;
    152. }
    153. /**
    154. * 获取导航栏高度
    155. *
    156. * @param context
    157. * @return
    158. */
    159. @TargetApi(14)
    160. public static int getNavigationBarHeight(Context context) {
    161. int result = 0;
    162. Resources res = context.getResources();
    163. boolean mInPortrait = (res.getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT);
    164. if (isNavBarVisible(context)) {
    165. String key;
    166. if (mInPortrait) {
    167. key = "navigation_bar_height";
    168. } else {
    169. key = "navigation_bar_height_landscape";
    170. }
    171. return getInternalDimensionSize(context, key);
    172. }
    173. return result;
    174. }
    175. private static int getInternalDimensionSize(Context context, String key) {
    176. int result = 0;
    177. try {
    178. int resourceId = Resources.getSystem().getIdentifier(key, "dimen", "android");
    179. if (resourceId > 0) {
    180. int sizeOne = context.getResources().getDimensionPixelSize(resourceId);
    181. int sizeTwo = Resources.getSystem().getDimensionPixelSize(resourceId);
    182. if (sizeTwo >= sizeOne) {
    183. return sizeTwo;
    184. } else {
    185. float densityOne = context.getResources().getDisplayMetrics().density;
    186. float densityTwo = Resources.getSystem().getDisplayMetrics().density;
    187. float f = sizeOne * densityTwo / densityOne;
    188. return (int) ((f >= 0) ? (f + 0.5f) : (f - 0.5f));
    189. }
    190. }
    191. } catch (Resources.NotFoundException ignored) {
    192. return 0;
    193. }
    194. return result;
    195. }
    196. @SuppressLint("NewApi")
    197. private static float getSmallestWidthDp(Activity activity) {
    198. DisplayMetrics metrics = new DisplayMetrics();
    199. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
    200. activity.getWindowManager().getDefaultDisplay().getRealMetrics(metrics);
    201. } else {
    202. activity.getWindowManager().getDefaultDisplay().getMetrics(metrics);
    203. }
    204. float widthDp = metrics.widthPixels / metrics.density;
    205. float heightDp = metrics.heightPixels / metrics.density;
    206. return Math.min(widthDp, heightDp);
    207. }
    208. public static boolean isNavigationAtBottom(Activity activity) {
    209. Resources res = activity.getResources();
    210. boolean mInPortrait = (res.getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT);
    211. return (getSmallestWidthDp(activity) >= 600 || mInPortrait);
    212. }
    213. /**
    214. * dp2px
    215. */
    216. public static int dip2px(Context context, float dpValue) {
    217. final float scale = context.getApplicationContext().getResources().getDisplayMetrics().density;
    218. return (int) (dpValue * scale + 0.5f);
    219. }
    220. }
    1. package com.iflytek.jzapp.utils.immersive;
    2. import android.os.Build;
    3. import android.text.TextUtils;
    4. import java.io.BufferedReader;
    5. import java.io.IOException;
    6. import java.io.InputStreamReader;
    7. import java.util.regex.Pattern;
    8. /**
    9. * @author:luck
    10. * @data:2018/3/28 下午1:02
    11. * @描述: Rom版本管理
    12. */
    13. public class RomUtils {
    14. private static final String[] ROM_SAMSUNG = {"samsung"};
    15. private final static String UNKNOWN = "unknown";
    16. public static class AvailableRomType {
    17. public static final int MIUI = 1;
    18. public static final int FLYME = 2;
    19. public static final int ANDROID_NATIVE = 3;
    20. public static final int NA = 4;
    21. }
    22. private static Integer romType;
    23. public static int getLightStatausBarAvailableRomType() {
    24. if (romType != null) {
    25. return romType;
    26. }
    27. if (isMIUIV6OrAbove()) {
    28. romType = AvailableRomType.MIUI;
    29. return romType;
    30. }
    31. if (isFlymeV4OrAbove()) {
    32. romType = AvailableRomType.FLYME;
    33. return romType;
    34. }
    35. if (isAndroid5OrAbove()) {
    36. romType = AvailableRomType.ANDROID_NATIVE;
    37. return romType;
    38. }
    39. romType = AvailableRomType.NA;
    40. return romType;
    41. }
    42. //Flyme V4的displayId格式为 [Flyme OS 4.x.x.xA]
    43. //Flyme V5的displayId格式为 [Flyme 5.x.x.x beta]
    44. private static boolean isFlymeV4OrAbove() {
    45. return (getFlymeVersion() >= 4);
    46. }
    47. //Flyme V4的displayId格式为 [Flyme OS 4.x.x.xA]
    48. //Flyme V5的displayId格式为 [Flyme 5.x.x.x beta]
    49. public static int getFlymeVersion() {
    50. String displayId = Build.DISPLAY;
    51. if (!TextUtils.isEmpty(displayId) && displayId.contains("Flyme")) {
    52. displayId = displayId.replaceAll("Flyme", "");
    53. displayId = displayId.replaceAll("OS", "");
    54. displayId = displayId.replaceAll(" ", "");
    55. String version = displayId.substring(0, 1);
    56. return stringToInt(version);
    57. }
    58. return 0;
    59. }
    60. //MIUI V6对应的versionCode是4
    61. //MIUI V7对应的versionCode是5
    62. private static boolean isMIUIV6OrAbove() {
    63. String miuiVersionCodeStr = getSystemProperty();
    64. if (!TextUtils.isEmpty(miuiVersionCodeStr)) {
    65. try {
    66. int miuiVersionCode = ValueOf.toInt(miuiVersionCodeStr);
    67. if (miuiVersionCode >= 4) {
    68. return true;
    69. }
    70. } catch (Exception e) {
    71. e.printStackTrace();
    72. }
    73. }
    74. return false;
    75. }
    76. public static int getMIUIVersionCode() {
    77. String miuiVersionCodeStr = getSystemProperty();
    78. int miuiVersionCode = 0;
    79. if (!TextUtils.isEmpty(miuiVersionCodeStr)) {
    80. try {
    81. miuiVersionCode = ValueOf.toInt(miuiVersionCodeStr);
    82. return miuiVersionCode;
    83. } catch (Exception e) {
    84. e.printStackTrace();
    85. }
    86. }
    87. return miuiVersionCode;
    88. }
    89. //Android Api 23以上
    90. private static boolean isAndroid5OrAbove() {
    91. return Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP;
    92. }
    93. private static String getSystemProperty() {
    94. String line;
    95. BufferedReader input = null;
    96. try {
    97. Process p = Runtime.getRuntime().exec("getprop " + "ro.miui.ui.version.code");
    98. input = new BufferedReader(new InputStreamReader(p.getInputStream()), 1024);
    99. line = input.readLine();
    100. input.close();
    101. } catch (IOException ex) {
    102. return null;
    103. } finally {
    104. if (input != null) {
    105. try {
    106. input.close();
    107. } catch (IOException e) {
    108. e.printStackTrace();
    109. }
    110. }
    111. }
    112. return line;
    113. }
    114. /**
    115. * Return whether the rom is made by samsung.
    116. *
    117. * @return {@code true}: yes<br>{@code false}: no
    118. */
    119. public static boolean isSamsung() {
    120. final String brand = getBrand();
    121. final String manufacturer = getManufacturer();
    122. return isRightRom(brand, manufacturer, ROM_SAMSUNG);
    123. }
    124. private static boolean isRightRom(final String brand, final String manufacturer, final String... names) {
    125. for (String name : names) {
    126. if (brand.contains(name) || manufacturer.contains(name)) {
    127. return true;
    128. }
    129. }
    130. return false;
    131. }
    132. private static String getManufacturer() {
    133. try {
    134. String manufacturer = Build.MANUFACTURER;
    135. if (!TextUtils.isEmpty(manufacturer)) {
    136. return manufacturer.toLowerCase();
    137. }
    138. } catch (Throwable ignore) {/**/}
    139. return UNKNOWN;
    140. }
    141. private static String getBrand() {
    142. try {
    143. String brand = Build.BRAND;
    144. if (!TextUtils.isEmpty(brand)) {
    145. return brand.toLowerCase();
    146. }
    147. } catch (Throwable ignore) {/**/}
    148. return UNKNOWN;
    149. }
    150. /**
    151. * 匹配数值
    152. *
    153. * @param str
    154. * @return
    155. */
    156. public static int stringToInt(String str) {
    157. Pattern pattern = Pattern.compile("^[-\\+]?[\\d]+$");
    158. return pattern.matcher(str).matches() ? ValueOf.toInt(str) : 0;
    159. }
    160. }
    1. package com.iflytek.jzapp.utils.immersive;
    2. /**
    3. * @author:luck
    4. * @date:2019-11-12 14:27
    5. * @describe:类型转换工具类
    6. */
    7. public class ValueOf {
    8. public static String toString(Object o) {
    9. String value = "";
    10. try {
    11. value = o.toString();
    12. } catch (Exception e) {
    13. }
    14. return value;
    15. }
    16. public static double toDouble(Object o) {
    17. return toDouble(o, 0);
    18. }
    19. public static double toDouble(Object o, int defaultValue) {
    20. if (o == null) {
    21. return defaultValue;
    22. }
    23. double value;
    24. try {
    25. value = Double.parseDouble(o.toString().trim());
    26. } catch (Exception e) {
    27. value = defaultValue;
    28. }
    29. return value;
    30. }
    31. public static long toLong(Object o, long defaultValue) {
    32. if (o == null) {
    33. return defaultValue;
    34. }
    35. long value = 0;
    36. try {
    37. String s = o.toString().trim();
    38. if (s.contains(".")) {
    39. value = Long.parseLong(s.substring(0, s.lastIndexOf(".")));
    40. } else {
    41. value = Long.parseLong(s);
    42. }
    43. } catch (Exception e) {
    44. value = defaultValue;
    45. }
    46. return value;
    47. }
    48. public static long toLong(Object o) {
    49. return toLong(o, 0);
    50. }
    51. public static float toFloat(Object o, long defaultValue) {
    52. if (o == null) {
    53. return defaultValue;
    54. }
    55. float value = 0;
    56. try {
    57. String s = o.toString().trim();
    58. value = Float.parseFloat(s);
    59. } catch (Exception e) {
    60. value = defaultValue;
    61. }
    62. return value;
    63. }
    64. public static float toFloat(Object o) {
    65. return toFloat(o, 0);
    66. }
    67. public static int toInt(Object o, int defaultValue) {
    68. if (o == null) {
    69. return defaultValue;
    70. }
    71. int value;
    72. try {
    73. String s = o.toString().trim();
    74. if (s.contains(".")) {
    75. value = Integer.parseInt(s.substring(0, s.lastIndexOf(".")));
    76. } else {
    77. value = Integer.parseInt(s);
    78. }
    79. } catch (Exception e) {
    80. value = defaultValue;
    81. }
    82. return value;
    83. }
    84. public static int toInt(Object o) {
    85. return toInt(o, 0);
    86. }
    87. public static boolean toBoolean(Object o) {
    88. return toBoolean(o, false);
    89. }
    90. public static boolean toBoolean(Object o, boolean defaultValue) {
    91. if (o == null) {
    92. return false;
    93. }
    94. boolean value;
    95. try {
    96. String s = o.toString().trim();
    97. if ("false".equals(s.trim())) {
    98. value = false;
    99. } else {
    100. value = true;
    101. }
    102. } catch (Exception e) {
    103. value = defaultValue;
    104. }
    105. return value;
    106. }
    107. public static <T> T to(Object o, T defaultValue) {
    108. if (o == null) {
    109. return defaultValue;
    110. }
    111. T value = (T)o;
    112. return (T) value;
    113. }
    114. }

  • 相关阅读:
    李沐动手学深度学习V2-BERT预训练和代码实现
    玩转SpringBoot:动态排除Starter配置,轻松部署
    idea打包项目,使用maven
    python每日一题【剑指 Offer 12. 矩阵中的路径】
    基于FPGA的图像高斯滤波实现,包括tb测试文件和MATLAB辅助验证
    【JAVA程序设计】基于SSM的电影院在线购票系统-沙箱支付
    springboot(12):@ControllerAdvice和@RestControllerAdvice注解使用
    LeetCode,回溯算法
    【Mysql】子查询
    10.10 翻译设置
  • 原文地址:https://blog.csdn.net/qq_26331411/article/details/125424231