Android开发者们都在处理9.0的兼容问题了,而我今天却在折腾4.2.2平板电视的底部状态栏隐藏问题。
前段时间帮另一个项目组同事搭的一个简易h5壳app这几天又让帮忙处理全屏问题。最初是隐藏了顶部状态栏,现在又要求隐藏底部虚拟按键。于是,唰唰唰,出现下面代码:
/**
* 隐藏底部虚拟按键,且全屏
*/
private void hideBottomMenu() {
//隐藏虚拟按键,并且全屏
if (Build.VERSION.SDK_INT > 11 && Build.VERSION.SDK_INT < 19) { // lower api
View v = this.getWindow().getDecorView();
v.setSystemUiVisibility(View.GONE);
} else if (Build.VERSION.SDK_INT >= 19) {
//for new api versions.
View decorView = getWindow().getDecorView();
int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
| View.SYSTEM_UI_FLAG_FULLSCREEN;
decorView.setSystemUiVisibility(uiOptions);
}
}
将其放在onCreate中,Android6.0手机上测试,一切正常,可以隐藏,唯一的不足是点击屏幕后底部虚拟按键又出现了,而且背景是透明度渐变的。于是又通过拦截touch事件,解决了点击这一问题。
但是,将app安装到平板电视后,发现虚拟按键隐藏不了。平板电视是基于4.2.2定制的系统,于是网上找相关资料,尝试了几种,最终发现可以通过命令行代码来实现隐藏与显示。
隐藏底部虚拟按钮
/**
* 关闭Android导航栏,实现全屏
*/
private void closeBar() {
try {
String command;
command = "LD_LIBRARY_PATH=/vendor/lib:/system/lib service call activity 42 s16 com.android.systemui";
ArrayList<String> envlist = new ArrayList<String>();
Map<String, String> env = System.getenv();
for (String envName : env.keySet()) {
envlist.add(envName + "=" + env.get(envName));
}
String[] envp = envlist.toArray(new String[0]);
Process proc = Runtime.getRuntime().exec(
new String[] { "su", "-c", command }, envp);
proc.waitFor();
} catch (Exception ex) {
e.printStackTrace();
}
}
显示底部虚拟按钮
由于是通过命令行su指令实现隐藏虚拟按钮,如果不主动去显示,则即使退出app,虚拟按钮仍然是隐藏的。所以,我们需要在退出app时,主动显示虚拟按钮,可以通过onDestory或者onStop或finish中调用以下方法实现。
/**
* 显示导航栏
*/
public static void showBar() {
try {
String command;
command = "LD_LIBRARY_PATH=/vendor/lib:/system/lib am startservice -n com.android.systemui/.SystemUIService";
ArrayList<String> envlist = new ArrayList<String>();
Map<String, String> env = System.getenv();
for (String envName : env.keySet()) {
envlist.add(envName + "=" + env.get(envName));
}
String[] envp = envlist.toArray(new String[0]);
Process proc = Runtime.getRuntime().exec(
new String[] { "su", "-c", command }, envp);
proc.waitFor();
} catch (Exception e) {
e.printStackTrace();
}
}
}
个人博客: IT老五
微信公众号:【IT老五(it-lao5)】,一起源创,一起学习!
以上代码可以实现4.2.2平板电视上对底部虚拟按键的隐藏与显示,再次强调下:通过该方法隐藏虚拟按键,退出app后虚拟按键是不会主动出现的,请在不需要全屏的时候或者退出app的时候主动调用显示虚拟按键。