在Lollipop上隐藏系统UI

时间:2015-01-14 11:38:35

标签: java android kiosk kiosk-mode

我有一个自助服务终端模式应用程序,它隐藏了系统UI(通知栏和导航按钮)的所有痕迹。在Android pre-Lollipop的版本上,以下工作正常(以root身份):

service call activity 42 s16 com.android.systemui

然而,在Lollipop中,这会使屏幕完全变黑并隐藏系统UI。因此无法使用它。

有没有人知道这方面的解决方法?

我已经尝试过屏幕固定的设备所有者/管理员解决方案,但不幸的是,这是不可接受的,因为它不会完全隐藏系统UI,但是当从屏幕底部滑动时,后退按钮会显示。

5 个答案:

答案 0 :(得分:8)

如果设备已植根,则可以禁用systemui pm disable-user com.android.systemui,然后设备所有者方法可以正常工作。

如果设备运行其他应用程序,则不应使用此方法,因为如果您的应用程序崩溃,则可能会禁用systemui并且用户无法与设备进行交互。

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
&device-owner package="com.mycompany" name="*mycompany" />

答案 1 :(得分:2)

我使用了以下设置来摆脱Android Marshmallow中的系统UI

final int flags = View.SYSTEM_UI_FLAG_LAYOUT_STABLE
        | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
        | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
        | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
        | View.SYSTEM_UI_FLAG_FULLSCREEN
        | View.SYSTEM_UI_FLAG_IMMERSIVE;

和OnCreate我有

this.requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_instructions);
getWindow().getDecorView().setSystemUiVisibility(flags);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);

然后我添加了代码,以便在用户滑动顶部或底部屏幕时隐藏键。

/* Hides Navigation bar again if user swipes it visible */
@Override
protected void onResume() {
        getWindow().getDecorView().setOnSystemUiVisibilityChangeListener(
                new View.OnSystemUiVisibilityChangeListener() {
                    @Override
                    public void onSystemUiVisibilityChange(int visibility) {
                    getWindow().getDecorView().setSystemUiVisibility(flags);
                    }
                });
    super.onResume();
    Log.i(TAG,"Activity Life Cycle : onResume : MainActivity Resumed");
}

这将在屏幕中短暂显示键并隐藏它。 唯一的问题是,如果您在固定活动之上打开新活动。它没有获得任何onResume指示。

答案 2 :(得分:0)

你可能想要使用'沉浸式模式'。您将找到所有必需的信息here

对于每个版本的Android,您都有一个示例here

答案 3 :(得分:0)

我遇到了同样的问题。此代码适用于4.4和Lollipop(经过测试)。也应该适用于其他版本。

 /**
     * Uses Root access to enable and disable SystemUI.
     * @param enabled Decide whether to enable or disable.
     */
    public void setSystemUIEnabled(boolean enabled){
        try {
            Process p = Runtime.getRuntime().exec("su");
            DataOutputStream os = new DataOutputStream(p.getOutputStream());
            os.writeBytes("pm " + (enabled ? "enable" : "disable")
                    + " com.android.systemui\n");
            os.writeBytes("exit\n");
            os.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

当然需要root

答案 4 :(得分:0)

我找到了这个其他解决方案,它可以在android 5.0上运行

private void hideNavigationBar(){
        try {
            Process process = Runtime.getRuntime().exec("su");
            DataOutputStream os = new DataOutputStream(process.getOutputStream());
            os.writeBytes("pm disable com.android.systemui\n");
            os.flush();
            os.writeBytes("exit\n");
            os.flush();
            process.waitFor();
            //////////////////////////////////////
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }