Android 4.2.2平板电视隐藏系统底部状态栏

Android4.2.2平板电视隐藏系统底部状态栏

Android开发者们都在处理9.0的兼容问题了,而我今天却在折腾4.2.2平板电视的底部状态栏隐藏问题。

前段时间帮另一个项目组同事搭的一个简易h5壳app这几天又让帮忙处理全屏问题。最初是隐藏了顶部状态栏,现在又要求隐藏底部虚拟按键。于是,唰唰唰,出现下面代码:

    /**
     * 隐藏底部虚拟按键,且全屏
     */
    private void hideBottomMenu() {
        //隐藏虚拟按键,并且全屏
        if (Build.VERSION.SDK_INT > 11 && Build.VERSION.SDK_INT < 19) { // lower api
            View v = this.getWindow().getDecorView();
            v.setSystemUiVisibility(View.GONE);
        } else if (Build.VERSION.SDK_INT >= 19) {
            //for new api versions.
            View decorView = getWindow().getDecorView();
            int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                    | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY 
                    | View.SYSTEM_UI_FLAG_FULLSCREEN;
            decorView.setSystemUiVisibility(uiOptions);
        }
    }

将其放在onCreate中,Android6.0手机上测试,一切正常,可以隐藏,唯一的不足是点击屏幕后底部虚拟按键又出现了,而且背景是透明度渐变的。于是又通过拦截touch事件,解决了点击这一问题。


但是,将app安装到平板电视后,发现虚拟按键隐藏不了。平板电视是基于4.2.2定制的系统,于是网上找相关资料,尝试了几种,最终发现可以通过命令行代码来实现隐藏与显示。

隐藏底部虚拟按钮
    /**
     * 关闭Android导航栏,实现全屏
     */
    private void closeBar() {
        try {
            String command;
            command = "LD_LIBRARY_PATH=/vendor/lib:/system/lib service call activity 42 s16 com.android.systemui";
            ArrayList<String> envlist = new ArrayList<String>();
            Map<String, String> env = System.getenv();
            for (String envName : env.keySet()) {
                envlist.add(envName + "=" + env.get(envName));
            }
            String[] envp = envlist.toArray(new String[0]);
            Process proc = Runtime.getRuntime().exec(
                    new String[] { "su", "-c", command }, envp);
            proc.waitFor();
        } catch (Exception ex) {
            e.printStackTrace();
        }
    }
显示底部虚拟按钮

由于是通过命令行su指令实现隐藏虚拟按钮,如果不主动去显示,则即使退出app,虚拟按钮仍然是隐藏的。所以,我们需要在退出app时,主动显示虚拟按钮,可以通过onDestory或者onStop或finish中调用以下方法实现。

   /**
     * 显示导航栏
     */
    public static void showBar() {
        try {
            String command;
            command = "LD_LIBRARY_PATH=/vendor/lib:/system/lib am startservice -n com.android.systemui/.SystemUIService";
            ArrayList<String> envlist = new ArrayList<String>();
            Map<String, String> env = System.getenv();
            for (String envName : env.keySet()) {
                envlist.add(envName + "=" + env.get(envName));
            }
            String[] envp = envlist.toArray(new String[0]);
            Process proc = Runtime.getRuntime().exec(
                    new String[] { "su", "-c", command }, envp);
            proc.waitFor();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

原文:简书ThinkinLiu 博客: IT老五

以上代码可以实现4.2.2平板电视上对底部虚拟按键的隐藏与显示,再次强调下:通过该方法隐藏虚拟按键,退出app后虚拟按键是不会主动出现的,请在不需要全屏的时候或者退出app的时候主动调用显示虚拟按键。



发表评论

必填项已用*标注

6 + 4 =