在Android中永久隐藏系统栏

3
这个问题已经被问过很多次了: 如何在安卓上永久隐藏状态栏? 安卓ICS隐藏系统栏 隐藏安卓永久系统栏 但大多数情况下,答案不起作用,或者只能在用户用手指滑动之前隐藏。
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                        WindowManager.LayoutParams.FLAG_FULLSCREEN);

这会导致应用程序崩溃。
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);

这将它暂时隐藏起来。
    window.decorView.systemUiVisibility =
        View.SYSTEM_UI_FLAG_LAYOUT_STABLE or
        View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION or
        View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or
        View.SYSTEM_UI_FLAG_HIDE_NAVIGATION or
        View.SYSTEM_UI_FLAG_FULLSCREEN or
        View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY

设置systemUIVisiblity具有完全相同的效果。
    val windowInsetsController =
        ViewCompat.getWindowInsetsController(window.decorView) ?: return
    // Configure the behavior of the hidden system bars
    windowInsetsController.systemBarsBehavior =
        WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
    // Hide both the status bar and the navigation bar
    windowInsetsController.hide(WindowInsetsCompat.Type.systemBars())

这似乎没有任何作用,但如果它有作用的话,它可能只会在滑动时隐藏。
我已经尝试在不同的事件上重复调用这些代码块:
val screenText : TextView = findViewById(R.id.textView5);
screenText.setOnClickListener {
    hideSystemUI()
}

创建一个TextView并在点击时调用代码块。
    window.decorView.setOnSystemUiVisibilityChangeListener { visibility ->
        // Note that system bars will only be "visible" if none of the
        // LOW_PROFILE, HIDE_NAVIGATION, or FULLSCREEN flags are set.
        if (visibility and View.SYSTEM_UI_FLAG_FULLSCREEN == 0) {
            // TODO: The system bars are visible. Make any desired
            // adjustments to your UI, such as showing the action bar or
            // other navigational controls.
            hideSystemUI()
        } else {
            // TODO: The system bars are NOT visible. Make any desired
            // adjustments to your UI, such as hiding the action bar or
            // other navigational controls.
        }
    }

这段代码摘自https://developer.android.com/training/system-ui/visibility

但它们的实现方法有些hacky,如果你很快就可以展开状态栏。导航栏在滑动后总是会出现。

为什么我想让这些栏消失呢? 因为我正在编写一个启动器。它应该类似于三星儿童模式。在输入密码之前,用户应该被禁止更改系统设置中的任何内容。如何在这些限制下实现呢?


3
在屏幕边缘滑动以显示进度条是一个系统手势, immersive mode 标志中没有一个可以阻止它 - 这很好,因为如果应用程序阻止使用主页按钮等功能,那将是一种非常令人沮丧的体验。我不知道三星儿童模式是如何工作的,但如果三星有一些系统钩子来覆盖通常的用户界面,并基本上“锁定”用户到特定的应用程序(或账户,或他们正在使用的方式),我也不会感到惊讶。但这些不是您给随机应用程序的权限类型。 - cactustictacs
@cactustictacs 你说的是正确的。在我的情况下,我想要一个可以在信息亭模式下持续运行的应用程序(基本上是相同的想法),现在这个应用程序应该在24/7运行,并且只能使用密码或PIN码才能退出信息亭模式访问它。问题在于,在更新的Android版本中没有适当的说明如何实现这一点,因为大多数说明都是7年前的,因此对于较新的版本不再起作用。有像Fully Kiosk等的应用程序可以实现这一点,因此它必须是可能的,但到目前为止没有线索如何做到这一点。 - Billy Cottrell
从Fully Kiosk的FAQ(https://www.fully-kiosk.com/en/#faq-android12)简单浏览来看,他们使用了“一些适度的黑客技术”和利用了一些漏洞——似乎Android 12已经修补了很多(并且他们告诉人们因此阻止操作系统升级)。他们关于如何完全隐藏Android 10及以下版本上的系统栏的说明涉及用户安装ADB、启用USB调试并运行一些特权提升命令。你可能会在这里找到一些知道那方面技巧的人,但是你最好去XDA Developers或其他类似网站咨询。 - cactustictacs
2个回答

1

我一直在使用它,目前为止它一直很正常。在setContentView()之后立即运行它。

    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
        window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
            WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
    }
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
        window.insetsController?.hide(WindowInsets.Type.statusBars())
    }

1
我尝试过应用这个方法,但状态栏并没有被永久隐藏,通过从顶部向下滑动会再次显示状态栏。另外,FLAG_FULLSCREEN在较新的版本中已经被弃用了。 - Billy Cottrell

1
适用于Android 11。请注意,此方法仅适用于自定义的Android操作系统,并且您具有更改操作系统源代码的特权。隐藏导航栏的方法在以下路径中可见: 在自定义的Android 11操作系统中隐藏SystemUI导航栏 查看源代码: https://android.googlesource.com/platform/prebuilts/fullsdk/sources/android-30/+/refs/heads/androidx-wear-wear-ongoing-release/com/android/systemui/statusbar/NavigationBarController.java

frameworks\base\packages\SystemUI\src\com\android\systemui\statusbar\phone\NavigationBarController.java

@Override
    public void onDisplayRemoved(int displayId) {
        removeNavigationBar(displayId);
    }


Using view to set flag cannot work properly because when you switch window or app the nav bar will appear again

你可以轻松地移除导航栏或其他元素。

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