【问题标题】:disabling and hiding android navigation bar/notification menu permanently永久禁用和隐藏android导航栏/通知菜单
【发布时间】:2014-10-17 18:03:27
【问题描述】:

我正在为一所学校开发一个 android 应用程序,我希望这个应用程序在打开时防止用户在设备上执行任何操作,除了我在我的应用程序中提供的内容,我的意思是做 NOTHING 其他。 .. 所以首先应该禁用并隐藏导航栏

我看到了这个,但它是 4.4+ 的,它不能解决问题,因为如果你滑动屏幕,你会得到菜单。 (How to hide navigation bar permanently in android activity?)

这也不起作用(Permanently hide navigation bar on activity) (Is there a way to hide the system/navigation bar in Android ICS) 我还尝试使用 onKeyDown 禁用导航栏操作,但它不适用于所有键。

另外我想删除通知栏,使用户可以访问设备的设置和其他东西..

这也不起作用(Disable the notification panel from being pulled down),正如这个链接中提到的那样,它没有解决它,它只是在显示它后隐藏它:S

我们将不胜感激,

谢谢。

【问题讨论】:

    标签: android


    【解决方案1】:

    您可以在 Android 5.0 中获得信息亭类型模式,使用提到的屏幕固定功能here:

    Android 5.0 引入了一个新的屏幕固定 API,可让您 暂时限制用户离开您的任务或被打断 通过通知。例如,如果您是 开发教育应用程序以支持高风险评估 Android 或单一用途或信息亭应用程序的要求。 一旦您的应用激活屏幕固定,用户就看不到 通知、访问其他应用程序或返回主屏幕,直到 您的应用退出该模式。

    您可以将设备锁定为信息亭。导航栏没有隐藏,但可以删除或禁用主页和最近按钮,具体取决于您激活模式的方式。测试了这个功能后写了一些资料here.

    【讨论】:

      【解决方案2】:

      有可能

      禁用状态通知栏:

      您需要在通知栏顶部放置一个视图,以便我们将触摸事件劫持到状态通知栏。废话不多说,代码如下:

      mView= new TextView(this);                                       
      mView.setText(".........................................................................");                       
      
      mLP = new WindowManager.LayoutParams(
              WindowManager.LayoutParams.MATCH_PARENT,
              100,
              // Allows the view to be on top of the StatusBar
              WindowManager.LayoutParams.TYPE_SYSTEM_ERROR,
              // Keeps the button presses from going to the background window
              WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
              // Enables the notification to recieve touch events
              WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL |
              // Draws over status bar
              WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN,
              PixelFormat.TRANSLUCENT);
      
      mLP.gravity =  Gravity.TOP|Gravity.CENTER;      
      
      mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
      mWindowManager.addView(mView, mLP);
      

      并且由于您使用的是系统覆盖窗口,因此您需要权限:

      <uses-permission android:name="android.permission.SYSTEM_OVERLAY_WINDOW" />
      

      注意:

      不要让您的应用全屏显示,因为支持沉浸式模式的 17 以上版本会破坏这种方法。

      【讨论】:

      • 应用程序崩溃了,当我添加 但它没有禁用通知栏
      • 尝试增加高度参数。用更大的值替换 100。它对我有用。
      • 我添加了权限,但应用程序仍然崩溃并显示错误消息:“原因:android.view.WindowManager$BadTokenException:无法添加窗口 android.view.ViewRootImpl$W@a969c7 -- 权限被拒绝对于此窗口类型“操作系统版本 6.0.1 设备:Nexus 5
      • @AhmadShahwaiz 现在有设备所有者权限,使用它可以让您访问可以禁用状态栏而无需任何黑客攻击的 API。 (操作系统 6 及以上)
      【解决方案3】:

      您不能在 Android 中禁用系统或通知面板。

      您可以隐藏这些元素(就像您已经发现的那样),但目前您不能永久禁用它们。

      您正在寻找不受支持的“Kiosk 模式”。

      与您正在寻找的最接近的是“沉浸式模式”(details) - 但这不会永久隐藏设置或导航控件。

      【讨论】:

      • 是的,但是隐藏在这里也不起作用,因为在屏幕上单击一下,导航菜单就会返回。
      • 这就是它应该如何工作的。 Android 不希望您永久隐藏系统元素,因此请确保您可以轻松访问它们。
      • 这完全是愚蠢的,使系统更不适合快节奏的游戏!想象一下玩 - 例如 - Dota2 并通过不小心点击屏幕顶部区域不断弹出一些烦人的菜单...... Android,我发誓总有一天我会打你的铁皮头! ...对不起大家。不过,感谢您的回答,为我节省了很多寻找不可能的时间。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-02-22
      • 2019-07-27
      • 1970-01-01
      • 1970-01-01
      • 2013-05-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多