Android ICS下隐藏系统栏的简便方法

10
我将提供ICS平板电脑供用户完成调查,因此我希望用户只使用我的应用程序。他们不应该能够切换到主屏幕,按返回按钮等等,所以我想完全隐藏系统栏。
我的平板电脑已经获取了root权限,我知道一些应用程序如这个可以帮助我,但我不需要这个应用程序的所有额外功能。
我发现这个教程可以帮助我,但如果我可以添加代码来实现自己的操作,那就太好了。
8个回答

11

在互联网上搜索了很多后,我终于找到了如何在4.2设备中隐藏和显示系统栏的方法:

隐藏:

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

如果 API 小于 14,可以使用 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)

在Andorid 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
@DArkO,你可以利用Android 4.4中提供的新沉浸式模式。否则,你可能需要找到系统UI的新服务ID(在4.2和4.3中为42)。 - TheIT
是的,我想你可能有它,因为你可能使用这段代码。你有什么办法获取服务ID吗?我不能使用沉浸模式,因为我需要一个不显示任何栏的展示器。对我来说,滑动以显示它们不起作用,如果有一种方法可以密码保护它,那也可能起作用,但到目前为止我还没有找到任何东西。感谢您的帮助。 - DArkO
@DArkO,你找到如何隐藏信息亭的栏了吗?如果可以,请分享一下。 - Cԃաԃ
谢谢!这在我的设备上确实有效!!!安卓4.1.2。我还在考虑如何在启动后自动隐藏栏。 - Lewis Z

8

这是一个很棒的应用程序。虽然我已经完成了调查应用程序,但我将来也可以再次使用这个应用程序。https://github.com/ppareit/HideBar/blob/master/src/be/ppareit/hidebar/Device.java - Tran Hoang Duy Anh

6

谢谢你的回答。你提供的三个链接中的解决方案仅适用于Android 3.0。这个设备是我的,我已经root了它。 - Tran Hoang Duy Anh
1
如果用户触摸屏幕,系统栏将重新开启 :) - Tran Hoang Duy Anh

4

我希望能够为大家添加一些信息,希望对某些人有用。

要在我的低成本中国平板电脑上实现真正的全屏工作,我需要编辑一个位于文件中的文件。

system/build.prop

替换文本

ro.property.tabletUI=true

使用

#ro.property.tabletUI=true

我注释掉那一行代码后,就可以使用

全屏(full screen)

了。

android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen"

对于manifest.xml中的每个活动

这个解决方案只适用于销售带有应用程序的平板电脑,并且需要root权限来编辑system/build.prop。因此,它并不适用于所有情况,请不要贬低这个小贡献。

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


我尝试了你的方法,但在启动时出现了一个“很抱歉,系统界面已停止运行”的警告。此后,系统栏被移除了,但有没有办法防止这个错误弹出? - richmb
@richmb 这个错误表示,如果不更改其他东西,你无法在 Android 构建设备上使用此解决方案,抱歉。 - Seraphim's

3
谷歌希望Android只用于消费者。他们将系统UI栏更紧密地集成到Android ICS(4.0)中,以防止人们对设备进行root并以此方式杀死栏。尝试删除系统栏进程将防止操作系统完全启动。
如果您想限制用户访问主屏幕,则使用Android ICS就无法实现了。我建议找到一个预装有Android 2.3的平板电脑制造商。或者,使用已root的Android 3.x设备。
如果您打算将Android用于信息亭或锁定设备,则最好选择一个更开放的操作系统。

感谢您的回答。由于这需要花费我的时间,我已经放弃了这个问题。使用 https://play.google.com/store/apps/details?id=com.goodmooddroid.gesturecontroldemo 对我来说已经足够好了 :) - Tran Hoang Duy Anh

2
我发现一个解决方案,在我的使用情况下可以完美地隐藏菜单栏,即使在非ROOT设备上也可行:
设置这个标志
layoutparams.flags = 0x80000000 | layoutparams.flags;

将我的窗口布局参数简单地更改一下就可以搞定了!

这是我使用的完整代码片段:

    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”是FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS,在Api级别21中引入的系统常量,它基本上表示“此窗口负责绘制系统栏的背景。”由于我没有手动绘制任何系统栏,所以没有显示菜单栏。

我只在一对运行Android ICS 4.0.3的Moverio BT-200上测试过,因为那是我目前正在使用的设备,而且现在我手头没有其他运行Api级别低于19的设备来测试。


0

有一种解决方法可以在几乎所有平板电脑上禁用菜单栏(而不是隐藏),而无需进行root。但这有点棘手,但它可以干净地工作。目前市场上的几个知名应用程序都使用此策略来实现其应用程序的禁用菜单栏功能。

  • 授予管理员特权(需要一次用户参与以激活)。
  • 使用设备管理器配置文件API以编程方式设置密码并锁定设备。
  • 然后在本机锁定屏幕之上加载任何UI。 (当然,每当活动之间发生转换时,这将显示背景锁定屏幕。但如果逻辑组织得好,那么它将是平稳的,并且用户注意到的会更少)
  • 需要启用时,请使用设备策略管理器对象的resetPassword(“”,0)重置密码。

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

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

我知道这不完全是你需要的,但对于其他人来说寻找解决此问题的方法可能很有用。


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