Android 全屏应用 - 阻止访问状态栏

Android fullscreen app - prevent access to status bar

我正在创建一个全屏应用程序,它将 运行 处于 "kiosk" 模式,因此用户将无法退出。该应用程序被定义为启动器(主屏幕)。

清单中的 Activity 定义为:

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

此外,Activity 确保全屏模式在其 onCreate() 中具有以下内容:

getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);

不过,状态栏好像还是可以访问的。默认情况下它是隐藏的,但仍然可以通过触摸并向下拉屏幕顶部来显示它(它以半透明背景而不是通常的纯黑色显示)。

我已经知道我可以通过在屏幕顶部添加一个透明的 10px 系统覆盖层 window 来防止这种情况发生,这将吸收触摸事件。但我删除了这个 hack,因为我认为它没有必要。

我确信这一切都工作正常并且在不诉诸 hackery 的情况下阻止了状态栏的显示。但有些地方发生了变化。我已经更新到最新的库存固件和系统软件 - 也许这已经改变了?

设备目前运行宁Android 4.4.4。我相信它可能已经在 4.4.1 之前。

这有可能吗?更有可能是 Android 中发生了某些变化,或者我破坏了某些东西,或者这一直都被破坏了,我只是刚刚注意到?

请注意,这是针对无法 root 的专用工业设备(霍尼韦尔 Dolphin 75e)。

However, it seems that the status bar is still accessible.

是的,因为com.android.systemui包是运行,它负责状态栏和软件导航栏。以下是有关禁用软件包的几个解决方案。 注意 为了使用解决方案,需要扩展权限(最好是 root.

重启持久性解决方案

重命名 /system/app/SystemUI.apkapk 扩展名或完全删除文件。您必须重新挂载 /system 分区,因为默认情况下它是只读的。在 renaming/deleting 之后,系统可能会卸载 /data/data/com.android.systemui 包。如果没有,请手动执行,然后重新启动。

重启无常的解决方法

Disable/enable 框架服务在运行时(例如在您的应用程序启动时)调用(至少在 KitKat 之前有效 ):

service call activity 42 s16 com.android.systemui  // disable status bar

am startservice -n com.android.systemui/.SystemUIService  // enable status bar

请注意,该解决方案不会在重启后持续存在。

将这段代码放在oncreate方法中

int myflag= View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
            | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
            | View.SYSTEM_UI_FLAG_LAYOUT_STABLE
            | View.SYSTEM_UI_FLAG_LOW_PROFILE
            | View.SYSTEM_UI_FLAG_FULLSCREEN
            | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION;

getWindow().getDecorView().setSystemUiVisibility(myflag);

了解更多详情 https://developer.android.com/training/system-ui/immersive.html