我需要我的root平板电脑平板电脑处于“自助服务终端模式”,因此通知栏应该被禁用(而不仅仅是隐藏在例如全屏游戏中)。
此代码仅暂时隐藏栏:
this.requestWindowFeature(Window.FEATURE_NO_TITLE); // Removes title bar
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.main);
当我把这个放在AndroidManifest的应用程序部分时也一样:
android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
我试图通过adb命令
禁用android-uipm disable com.android.systemui
但是我没有任何导航按钮!我只需要顶部的通知栏被阻止!
那么如何阻止通知栏无法打开?
答案 0 :(得分:2)
据我所知,没有正式的方法可以做到这一点,因为它可以被恶意使用,但这就是我实现它的方式。它的工作原理是粗暴地杀死处理导航/操作栏等的系统服务。但是我唯一可以找到它的东西。
这将阻止所有导航按钮,操作栏等。我不知道只能阻止其中一个
hideNav()在主活动中调用onCreate,并且从onDestroy调用showNav(),如果你想让管理员访问操作系统,你需要这样做,除非你专门重启服务,否则你不会能够在设备周围导航。
我的应用有一个退出按钮,只能通过密码访问。该按钮调用getActivity()。finish(),您需要调用该活动的onDestroy方法。
注意:我已经读过,在某些设备上,systemui服务并不总是42,因此您的平板电脑在命令中可能需要不同的数字。
public void hideNav()
{
Log.v(tag, "hideNav");
try
{
Process p;
p = Runtime.getRuntime().exec("su");
// Attempt to write a file to a root-only
DataOutputStream os = new DataOutputStream(p.getOutputStream());
os.writeBytes("service call activity 42 s16 com.android.systemui\n");
// Close the terminal
os.writeBytes("exit\n");
os.flush();
p.waitFor();
}
catch (Exception e)
{
Log.e(tag, "hideNav " + e.getMessage());
}
}
public void showNav()
{
Log.v(tag, "showNav");
try{
Process p;
p = Runtime.getRuntime().exec("su");
DataOutputStream os = new DataOutputStream(p.getOutputStream());
os.writeBytes("am startservice -n com.android.systemui/.SystemUIService\n");
// Close the terminal
os.writeBytes("exit\n");
os.flush();
p.waitFor();
}catch (IOException e) {
e.printStackTrace();
Log.e(tag, "showNav " + e.getMessage());
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
Log.e(tag, "showNav " + e.getMessage());
}
}
答案 1 :(得分:2)
我知道,这不是解决这个问题的一般方法,但就我而言,我可以这样做 我修改了SystemUI.apk。
我删除了状态栏的背景,并将高度和宽度设置为内容视图的0dip。
这只能这样做,因为我只为我自己的相同平板电脑服务我的应用程序!!