Android沉浸式状态栏(包含 小米、魅族)

Android沉浸式状态栏(包含 小米、魅族)

今天魅族手机 flyme 6(android 7.0) 状态栏问题搞的我晕头转向,后来找到flyme开放平台 才将问题解决。因此,有必要记录一下2018.04.24此刻项目中关于Android状态栏的完成解决方案。

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //  透明、深色字体状态栏
        StatusBarUtil.initStatusBar(this, true, true);
        //
        setContentView(R.layout.activity_main);
    }

}

StatusBarUtil

以下代码中用的StatusbarColorUtils类,来自flyme开放平台

public class StatusBarUtil {
    /**
     * 沉浸式状态栏
     *
     * @param activity
     * @param isLightStatusBar 是否为浅色状态栏(黑色字体图标)
     * @param isTransStatusBar 是否为透明状态栏
     */
    public static void initStatusBar(Activity activity, boolean isLightStatusBar, boolean isTransStatusBar) {
        // 6.0以上
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            // 设置浅色状态栏(神色背景图标)
            StatusBarUtil.StatusBarLightMode(activity, isLightStatusBar);
            // 透明状态栏
            if (isTransStatusBar) {
                StatusBarUtil.setTransStatusBar(activity, isLightStatusBar);
            }
        }
    }


    /**
     * 透明状态栏
     *
     * @param isLightStatusBar 浅色状态栏(黑色字体、图标)
     */
    private static void setTransStatusBar(Activity activity, boolean isLightStatusBar) {
        // 大于android 5.0
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            Window window = activity.getWindow();
            // 清除状态 透明的状态栏| 透明导航栏
            window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS
                    | WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
            // 大于 android 6.0
            if (isLightStatusBar && Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                // 6.0增加了View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR,这个字段就是把状态栏标记为浅色,然后状态栏的字体颜色自动转换为深色。
                // 所以,如果需要浅色的状态栏,只能在Android6.0及以后的版本中实现
                window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                        | View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                        | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
            } else {
                window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                        | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
            }
            // 透明状态栏
            // FLAG_TRANSLUCENT_STATUS 只是把状态栏设置为透明的,但是,状态栏是有背景色的,一些手机的状态栏背景色为透明,而一些手机的状态栏背景色为半透明的黑色
            // 于是在5.0上增加了WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS
            // getWindow().setStatusBarColor(int color)
            window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
            window.setStatusBarColor(Color.TRANSPARENT);
        }
    }


    /**
     * 设置状态栏黑色字体图标,
     * 适配4.4以上版本MIUIV、Flyme和6.0以上版本其他Android
     *
     * @param activity
     * @param dark     是否把状态栏字体及图标颜色设置为深色
     * @return 1:MIUUI 2:Flyme 3:android6.0
     */
    private static int StatusBarLightMode(Activity activity, boolean dark) {
        int result = 0;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            if (MIUISetStatusBarLightMode(activity.getWindow(), dark)) {
                result = 1;
            } else if (isFlymeOS()) {
                result = 2;
                // 设置魅族状态栏 深浅颜色
                StatusbarColorUtils.setStatusBarDarkIcon(activity, dark);
            } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
                result = 3;
            }
        }
        return result;
    }

    /**
     * 设置状态栏字体图标为深色,需要MIUIV6以上
     *
     * @param window 需要设置的窗口
     * @param dark   是否把状态栏字体及图标颜色设置为深色
     * @return boolean 成功执行返回true
     */
    private static boolean MIUISetStatusBarLightMode(Window window, boolean dark) {
        boolean result = false;
        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;
    }


    // ############################魅族系统判断#####################################

    // 判断是魅族操作系统
    private static boolean isFlymeOS() {
        return getMeizuFlymeOSFlag().toLowerCase().contains("flyme");
    }

    /**
     * 获取魅族系统操作版本标识
     */
    private static String getMeizuFlymeOSFlag() {
        String str = getSystemProperty("ro.build.display.id", "");
        return str;
    }

    private static String getSystemProperty(String key, String defaultValue) {
        try {
            Class clz = Class.forName("android.os.SystemProperties");
            Method get = clz.getMethod("get", String.class, String.class);
            return (String) get.invoke(clz, key, defaultValue);
        } catch (Exception e) {
        }
        return defaultValue;
    }

}

推荐一篇关于沉浸式状态栏的文章:

https://juejin.im/post/5a25f6146fb9a0452405ad5b

https://juejin.im/entry/59469d3f61ff4b006cf363ca

你可能感兴趣的:(Android代码)