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.apk
的 apk
扩展名或完全删除文件。您必须重新挂载 /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
我正在创建一个全屏应用程序,它将 运行 处于 "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.apk
的 apk
扩展名或完全删除文件。您必须重新挂载 /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