【问题标题】:Easy way to hide system bar on Android ICS在 Android ICS 上隐藏系统栏的简单方法
【发布时间】:2012-05-04 08:16:50
【问题描述】:

我将向用户提供我的 ICS 平板电脑以供用户完成调查,因此我希望用户仅使用我的应用程序。他们应该不能切换到主屏幕,按返回按钮等,所以我想完全隐藏系统栏。

我的平板电脑已植根,我知道一些应用程序,例如 this 可以帮助我,但我不需要这个应用程序的所有额外功能。

我发现 this tutorial 可以帮助我,但如果我可以添加代码自己做,那就太好了。

【问题讨论】:

    标签: android fullscreen android-4.0-ice-cream-sandwich kiosk-mode


    【解决方案1】:

    在互联网上进行了大量搜索后,我设法让系统栏隐藏并出现在 4.2 设备中:

    隐藏:

    Runtime.getRuntime().exec("service call activity 42 s16 com.android.systemui");
    

    对于小于 14 的 API,或者使用 79 而不是 42。您可能还需要包含 SET_DEBUG_APP 权限,在这种情况下,您需要使用系统密钥签名或安装在 /system/app/ 目录中的应用程序。

    显示:

    Runtime.getRuntime().exec("am startservice --user 0 -n com.android.systemui/.SystemUIService");
    

    另外,有些人使用了 -a(而不是 -n)选项,尽管这导致我的设备出现错误:

    错误:未找到;没有服务启动。

    对于 Android 4.4,有一个称为沉浸式模式的新功能,它隐藏了系统栏和状态栏。系统 UI 由用户通过使用从屏幕顶部或底部的边缘滑动来切换。更多详情请看:

    http://developer.android.com/reference/android/view/View.html#setSystemUiVisibility(int)

    Using new IMMERSIVE mode in android kitkat

    例如:

    getWindow().getDecorView().setSystemUiVisibility(
              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)
    

    【讨论】:

    • 您在 KitKat 上找到了如何执行此操作吗?它非常适合我在 kitkat 之前测试过的设备
    • @DArkO 您可以使用 4.4 中提供的新沉浸式模式。否则您可能需要为系统 UI 找到新的服务 ID(4.2 和 4.3 中的 42)。
    • 是的,我认为您可能拥有它,因为您可能使用了此代码。知道如何获取服务ID吗?我无法使用沉浸式模式,因为我需要信息亭而不显示条形图。滑动以显示它们对我不起作用,如果有一种密码保护方法也可能起作用,但到目前为止我什么也找不到。感谢您的帮助
    • @DArkO 你知道如何隐藏信息亭的栏吗?如果可以,请分享。
    • 谢谢!这确实适用于我的设备!!!安卓 4.1.2。我还在想如何在启动后自动隐藏栏。
    【解决方案2】:

    HideBar 具有专门针对此用例的信息亭模式。

    http://ppareit.github.com/HideBar/ 提供免费下载。 您也可以通过 https://play.google.com/store/apps/details?id=be.ppareit.hidebar 在市场上找到它。

    如果您想将其整合到您自己的测试/调查应用程序中,您可以随时联系开发人员(请参阅电子邮件链接)。可以解释代码或提供Intent 进行隐藏。

    【讨论】:

    【解决方案3】:

    检查此链接:(需要root) http://android.serverbox.ch/?p=306

    这里也发布了类似的问题: Is there a way to hide the system bar in Android 3.0? It's an internal device and I'm managing navigation

    或试试 HideBar http://ppareit.github.com/HideBar/

    其实你可以简单地将系统栏置于“熄灯”模式,系统栏按钮和通知会变暗。

    View v = findViewById(R.id.view_id);
    v.setSystemUiVisibility(View.STATUS_BAR_HIDDEN);
    

    【讨论】:

    • 感谢您的回答。您的三个链接中的解决方案仅适用于Android 3.0。该设备是我的,我已经植根了。
    • 如果用户触摸屏幕,系统栏将再次打开:)
    【解决方案4】:

    我想在现有回复中添加一些信息,希望对某人有用。

    要在我的低成本中国平板电脑上实现真正的全屏显示,我需要编辑位于

    的文件
    system/build.prop
    

    替换文字

    ro.property.tabletUI=true
    

    #ro.property.tabletUI=true
    

    (我评论了这一行)。之后,我可以使用

    获得全屏
    android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen"
    

    对于 minfest.xml 中的每个活动

    此解决方案仅适用于您销售带有应用程序的平板电脑并且需要 root 权限才能编辑 system/build.prop所以这不是一个适合所有人的解决方案,所以请不要对这个小小的贡献投反对票。

    编辑: 我注意到我的平板电脑的框架上有硬件按钮(主页、菜单和返回)。所以Android让我隐藏系统栏。我尝试了其他没有硬件按钮的平板电脑没有成功

    【讨论】:

    • 我试过你的方法,我得到一个“不幸的是,系统 UI 已停止。”启动时发出警告。在此之后系统栏被删除,但是有没有办法防止这个错误弹出?
    • @richmb 这个错误表明你不能在不接触其他东西的情况下将此解决方案用于你的设备的 Android 版本,抱歉。
    【解决方案5】:

    Google 打算仅将 Android 用于消费者。他们将系统 UI 栏更紧密地集成到 Android ICS (4.0) 中,以防止人们以这种方式生根设备并杀死栏。尝试删除系统栏进程将阻止操作系统完全启动。

    如果您想限制用户访问主屏幕,那么您在使用 Android ICS 时就不走运了。我建议找一家平板电脑制造商来为设备预装 Android 2.3。要么,要么使用有根的 Android 3.x 设备。

    如果您打算将 Android 用于信息亭或锁定设备,那么您最好选择更开放的操作系统。

    【讨论】:

    【解决方案6】:

    我找到了一个解决方案,在我的用例中,即使在未根目录的设备上也能隐藏菜单栏,就像一个魅力:

    设置这个标志

    layoutparams.flags = 0x80000000 | layoutparams.flags;
    

    到我的窗口的布局参数就可以了!

    这是我使用的完整的 sn-p:

        Window window = getWindow();
        android.view.WindowManager.LayoutParams layoutparams = window.getAttributes();
        layoutparams.flags = 0x80000000 | layoutparams.flags;
        window.setAttributes(layoutparams);
    

    在我的 Activity onCreate 中。

    为了找出这一点,我反向设计了一个非系统 Apk,我发现它能够以某种方式做到这一点。

    根据官方文档:

    http://developer.android.com/reference/android/view/WindowManager.LayoutParams.html#FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS

    “0x80000000”是Api level 21中作为系统常量引入的FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS,基本表示“这个Window负责为系统栏绘制背景”。由于我没有手动绘制任何系统栏,因此没有显示菜单栏。

    我只在一对运行 Android ICS 4.0.3 的 Moverio BT-200 上进行了测试,因为那是我目前正在使用的设备,还因为现在我没有其他设备在 19 之前运行 Api 级别在我的手下测试它。

    【讨论】:

      【解决方案7】:

      有一种解决方法可以在所有大多数平板电脑中禁用菜单栏(而不是隐藏)而无需生根。但这有点棘手,但它很干净。目前市场上的一些知名应用程序使用此策略为其应用程序实现此禁用菜单栏功能。

      • 授予管理员权限(需要一次用户参与才能激活)。
      • 使用设备管理配置文件 API 以编程方式设置密码并锁定设备。
      • 然后在本机锁定屏幕顶部加载任何 UI。 (当然,每当活动之间发生转换时,这将显示背景锁定屏幕。但如果逻辑组织得当,那么它会很流畅,并且不会被用户注意到)
      • 当需要重新启用时,使用设备策略管理器对象的resetPassword("", 0) 将密码重置为""。

      【讨论】:

        【解决方案8】:

        为了补充已经给出的答案,如果它对需要类似行为的人有用,有这个适用于 android 设备 4.0 及更高版本的教程,它告诉你如何隐藏导航栏和状态栏(他们会再次触摸屏幕时重新出现):

        https://developer.android.com/training/system-ui/navigation.html

        我意识到这不是您所需要的,但可能对其他正在研究此问题的人有用。

        【讨论】:

          猜你喜欢
          • 2013-09-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-12-07
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多