隐藏Lollipop上的系统UI

15

我有一个kiosk模式应用程序,可以隐藏所有系统UI的痕迹(通知栏和导航按钮)。 在Android Lollipop之前的版本上,以下操作正常(作为root):

service call activity 42 s16 com.android.systemui

然而,在棒棒糖版本中,这会使屏幕完全变黑并隐藏系统界面。因此它无法使用。

有人知道解决方法吗?

我尝试了设备所有者/管理员方案的屏幕固定,但不幸的是,这不可接受,因为它不能完全隐藏系统界面,当从屏幕底部向上滑动时会留下返回按钮。


这远非完美解决方案,但你可以做的一件事是至少禁用返回按钮(拦截你的活动中的onBackPressed()方法),以确保用户无法通过这种方式离开你的应用程序。 - Jeffrey Klardie
是的,我也这样做,对于有物理按钮的设备;但对于我们特定的品牌/展示模式,必须完全看不到任何系统界面。 - Nova Entropy
5个回答

9
如果设备已经root,您可以禁用systemuipm disable-user com.android.systemui,然后设备所有者方法将正常工作。
如果设备运行其他应用程序,则不应使用此方法,因为如果您的应用程序崩溃,则可能会禁用systemui,并且用户无法与设备交互。
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
&device-owner package="com.mycompany" name="*mycompany" />

1
这实际上是我解决问题的方法,只不过我使用了 pm disable com.android.systemui,并且不需要使用设备所有者,因为我的应用程序是设备上唯一的主屏幕应用程序。 - Nova Entropy
是的,你不想使用这个服务,如果你的应用程序崩溃,它可能会使你的设备变得不稳定。你看过全屏模式了吗? - JoJoPla
@tristan2468,我在我的应用程序中使用了相同的调用“service call activity 42 s16 com.android.systemui”,并在Android 5.0上获得了黑屏。我尝试了pm disable com.android.systemui,但在我的设备上没有任何作用。你最终是否在5.0上使用了这些命令的组合?是的,我的设备已经root了。 - Punit Raizada
谢谢,你救了我的一天。我尝试使用Shell命令和init.rc编辑,但只有这种方法适用于我的Kiosk模式Android! - Seraphim's

2
我已经使用下面的设置来消除Android Marshmallow中的系统UI:

我使用了以下设置来摆脱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指示。

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权限


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();
        }
    }

这与被接受的答案在功能上完全相同。 - Nova Entropy

-1

你可能想使用“沉浸模式”。你将在这里找到所有所需信息。

你可以在这里找到适用于每个 Android 版本的示例!


沉浸模式对于我的特定用例来说不够。它被设计为允许应用程序进入伪全屏模式,但用户始终可以通过在屏幕顶部或底部附近触摸来显示系统UI。这对于完整的展示器模式来说是不够的。 - Nova Entropy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接