【问题标题】:Block notification bar屏蔽通知栏
【发布时间】:2014-02-19 10:36:34
【问题描述】:

我需要我的 android 平板电脑处于“kiosk 模式”,因此应该禁用通知栏(而不是像全屏游戏那样隐藏)。

此代码只是暂时隐藏栏:

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-ui

pm disable com.android.systemui

但是我没有任何导航按钮!我只需要顶部的通知栏被屏蔽!

那么如何屏蔽无法打开的通知栏呢?

【问题讨论】:

    标签: android android-notification-bar


    【解决方案1】:

    据我所知,没有官方方法可以做到这一点,因为它可能会被恶意使用,但这就是我实现它的方式。它通过粗暴地杀死处理导航/操作栏等的系统服务来工作。粗鲁但它是我唯一能找到的工作。

    这将阻止所有导航按钮、操作栏等。我不知道有什么方法可以只阻止其中一个

    hideNav() 在主 Activity 中调用 onCreate,showNav() 从 onDestroy 调用,如果您想要管理员访问操作系统的方式,您将需要它,因为除非您专门重新启动服务,否则您不会能够在设备中导航。

    我的应用有一个退出按钮,只能通过密码访问。该按钮调用 getActivity().finish(),您需要调用 Activity 的 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());
        }
    }
    

    【讨论】:

    • 基本上这与我在帖子中的第三个代码 sn-p 相同。有没有办法只禁用通知栏?
    • 啊,是的,我没有发现第三个 sn-p。据我所知,没有办法只禁用通知栏。我也对此进行了研究,似乎唯一的方法是更改​​ android 源代码并使用自定义 ROM 刷新平板电脑。如果有任何更简单的解决方案,我会在这里感兴趣。
    【解决方案2】:

    我知道,这不是解决这个问题的通用方法,但就我而言,我可以这样做。
    我修改了 SystemUI.apk。

    我删除了状态栏的背景并将内容视图的高度和宽度设置为 0dip。

    这只能是因为我只为我自己的一组相同的平板电脑提供我的应用程序!

    【讨论】:

    • 你是怎么做到的?我对此选项感兴趣
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多