我正在创建一个全屏应用程序,它将以“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
系统覆盖窗口来阻止这种情况,这将吸收触摸事件。但我删除了这个黑客,因为我认为没有必要。
我确信这一切都很好,并阻止状态栏显示而不诉诸hackery。但某些地方发生了变化。我已经更新到最新的固件和系统软件 - 也许这改变了这个?
该设备目前正在运行Android
4.4.4。我相信它可能在4.4.1之前。
这有可能吗?更有可能是Android
发生了变化,或者我已经破坏了某些东西,或者这种情况一直都被打破了,我只是注意到了吗?
请注意,这适用于无法生根的专业工业设备(霍尼韦尔Dolphin 75e)。
但是,似乎状态栏仍然可访问。
是的,因为com.android.systemui
包正在运行,它负责状态栏和软件导航栏。以下是禁用该软件包的几个解决方案。请注意,为了使用解决方案,需要扩展权限(理想情况为root
)。
重命名apk
的/system/app/SystemUI.apk
扩展名或完全删除该文件。您必须重新安装/system
分区,因为它默认为只读。重命名/删除系统后,可能会卸载/data/data/com.android.systemui
包。如果没有,请手动执行,然后重新启动。
通过调用(至少在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