永久禁用和隐藏安卓导航栏/通知菜单

3
我正在为一所学校开发安卓应用程序,我希望当用户打开此应用程序时,除了我在应用程序内提供的内容之外,防止用户在设备上做任何其他事情,我是指什么都不做... 首先,导航栏应该被禁用和隐藏。
我看到这个但它是针对4.4+的,而且它并不能解决问题,因为如果你滑动屏幕,你会重新得到菜单。 (如何在Android活动中永久隐藏导航栏?)
这也不起作用(在活动中永久隐藏导航栏) (有没有办法在Android ICS中隐藏系统/导航栏) 我还尝试使用onKeyDown来禁用导航栏操作,但它并不适用于所有键。
此外,我想删除通知栏,使用户可以访问设备设置和其他内容。
这也没有起作用(禁用下拉通知面板),如此链接中所述,它并没有解决问题,只是在显示之后将其隐藏:S

希望得到帮助,
谢谢。
3个回答

4
您可以在Android 5.0中使用屏幕固定功能来获取一个类似于亭台式模式的模式,详情请参阅此处
引入了一个名为“screen pinning”的新API,让您能够暂时限制用户离开您的任务或被通知打断。例如,如果您正在开发支持Android高风险评估要求的教育应用程序或单一用途应用程序,这将非常有用。一旦您的应用程序激活了屏幕固定,用户就不能看到通知、访问其他应用程序或返回主屏幕,直到您的应用程序退出该模式。
您可以锁定设备以获得一个类似于亭台式的模式。导航栏不会被隐藏,但是主页和最近使用的按钮可以根据您如何激活该模式而被删除或禁用。我在测试此功能之后撰写了一些信息,详情请参见此处

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以上版本会破坏此方法。

应用程序崩溃了,当我添加了<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />之后它可以正常工作,但它没有禁用通知栏。 - Hamzeh
尝试增加Height参数。将100替换为更大的值。这对我有用。 - amalBit
我已经添加了权限,但应用程序仍然崩溃,并显示以下错误消息: “Caused by: android.view.WindowManager$BadTokenException: Unable to add window android.view.ViewRootImpl$W@a969c7 -- permission denied for this window type” 操作系统版本为6.0.1 设备:Nexus 5 - Ahmad Shahwaiz
@AhmadShahwaiz 现在有设备所有者权限,使用它将为您提供访问API的权限,而无需进行任何黑客攻击即可禁用状态栏。(OS 6及以上) - amalBit

1

您无法在Android系统中禁用系统或通知面板。

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

您正在寻找“展示模式”,但是该模式不受支持。

最接近您要寻找的是“沉浸模式”(详情)- 但这并不能永久隐藏设置或导航控件。


是的,但在这里隐藏也不起作用,因为在屏幕上单击一次导航菜单就会返回。 - Hamzeh
这就是它应该工作的方式。Android不希望您永久隐藏系统元素,因此确保您可以轻松访问它们。 - Booger
这太愚蠢了,使系统甚至不适合快节奏的游戏!想象一下玩 - 例如 - Dota2,并且通过意外点击屏幕顶部区域而不断弹出一些烦人的菜单... Android,总有一天我会敲打你的铁头,我发誓!...抱歉各位。虽然如此,感谢您的答案,为我节省了很多寻找不可能的时间。 - ElDoRado1239

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接