我有一个自助服务终端模式应用程序,它隐藏了系统UI(通知栏和导航按钮)的所有痕迹。在Android pre-Lollipop的版本上,以下工作正常(以root身份):
service call activity 42 s16 com.android.systemui
然而,在Lollipop中,这会使屏幕完全变黑并隐藏系统UI。因此无法使用它。
有没有人知道这方面的解决方法?
我已经尝试过屏幕固定的设备所有者/管理员解决方案,但不幸的是,这是不可接受的,因为它不会完全隐藏系统UI,但是当从屏幕底部滑动时,后退按钮会显示。
答案 0 :(得分:8)
如果设备已植根,则可以禁用systemui pm disable-user com.android.systemui
,然后设备所有者方法可以正常工作。
如果设备运行其他应用程序,则不应使用此方法,因为如果您的应用程序崩溃,则可能会禁用systemui并且用户无法与设备进行交互。
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
&device-owner package="com.mycompany" name="*mycompany" />
答案 1 :(得分:2)
我使用了以下设置来摆脱Android Marshmallow中的系统UI
final int flags = 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;
和OnCreate我有
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_instructions);
getWindow().getDecorView().setSystemUiVisibility(flags);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
然后我添加了代码,以便在用户滑动顶部或底部屏幕时隐藏键。
/* Hides Navigation bar again if user swipes it visible */
@Override
protected void onResume() {
getWindow().getDecorView().setOnSystemUiVisibilityChangeListener(
new View.OnSystemUiVisibilityChangeListener() {
@Override
public void onSystemUiVisibilityChange(int visibility) {
getWindow().getDecorView().setSystemUiVisibility(flags);
}
});
super.onResume();
Log.i(TAG,"Activity Life Cycle : onResume : MainActivity Resumed");
}
这将在屏幕中短暂显示键并隐藏它。 唯一的问题是,如果您在固定活动之上打开新活动。它没有获得任何onResume指示。
答案 2 :(得分:0)
答案 3 :(得分:0)
我遇到了同样的问题。此代码适用于4.4和Lollipop(经过测试)。也应该适用于其他版本。
/**
* Uses Root access to enable and disable SystemUI.
* @param enabled Decide whether to enable or disable.
*/
public void setSystemUIEnabled(boolean enabled){
try {
Process p = Runtime.getRuntime().exec("su");
DataOutputStream os = new DataOutputStream(p.getOutputStream());
os.writeBytes("pm " + (enabled ? "enable" : "disable")
+ " com.android.systemui\n");
os.writeBytes("exit\n");
os.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
当然需要root
答案 4 :(得分:0)
我找到了这个其他解决方案,它可以在android 5.0上运行
private void hideNavigationBar(){
try {
Process process = Runtime.getRuntime().exec("su");
DataOutputStream os = new DataOutputStream(process.getOutputStream());
os.writeBytes("pm disable com.android.systemui\n");
os.flush();
os.writeBytes("exit\n");
os.flush();
process.waitFor();
//////////////////////////////////////
} catch (InterruptedException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}