Android - 去掉主页和导航按钮

9
我正在尝试删除主页按钮和多线程按钮。目标是从运行中的应用程序完全删除它,最好是从我们正在使用的平板电脑上的每个应用程序中完全删除它。使用全屏不是我们想要的,因为用户不应该能够退出全屏模式,即使他想要这样做(这是一款定制商业应用程序,出于多种原因,这是所需的行为)。

Nexus 10 without the home and navigation buttons

这是Nexus 10的结果。我们通过在编译CyanogenMod之前更改SystemUI源代码来实现这一点。
不幸的是,我们必须在Asus ZenPad 10上复制这个过程,因为没有可用的CyanogenMod。我们有一个版本可以创建系统应用程序,但是将每个应用程序更改为系统应用程序并不是我们想要的。
我们在这个链接中找到了http://developer.oesf.biz/em/developer/reference/eggplant/constant-values.html#android.view.View.STATUS_BAR_DISABLE_HOME的标志,可以禁用主页和导航按钮,但只能与系统应用程序一起使用。
我们尝试获取已在平板电脑中编译的SystemUI.apk文件,对其进行反编译和更改。问题是,我们要么有无用的smali文件,要么只有res/和AndroidManifest.xml文件(Asus将SystemUI.apk更改为两个自己的apk)。
所以...我们有点绝望啊哈哈。寻找提示/想法来尝试移除这些按钮。最好不要重新编译或做一些奇怪的事情。

如果你只需要一个应用程序全屏运行,你可以尝试另一种方法。你可以在后台运行一个服务,定期检查你的全屏应用是否处于活动状态,当用户试图离开你的应用时,服务会立即重新启动你的应用。虽然不完全符合你的要求,但也许可以帮到你。 - jan hruska
6个回答

3
这是通过使用沉浸式全屏模式SYSTEM_UI_FLAG_HIDE_NAVIGATIONSYSTEM_UI_FLAG_FULLSCREEN标志的组合权限实现的。这些标志隐藏了导航栏和状态栏,现在您可以在屏幕底部放置一个线性布局,只显示返回图标,以创建所需的效果。还要注意,重要的是要理解一旦用户向上滑动,正常的导航栏将可见(不确定是否可以通过拦截触摸事件来处理)。或者,您也可以尝试在此处提到的解决方案如何在Android中禁用主页和其他系统按钮?

如果只有硬件导航按钮,也可以参考这个GitHub项目: https://github.com/shaobin0604/Android-HomeKey-Locker

最后但并非最不重要的是,commsware提供了更多关于此主题的答案,可能会很有用。 无法在特定的安卓设备上禁用主页按钮


谢谢你,但是我已经尝试了你提出的每个解决方案,但都不适合这种情况。第一个解决方案还可以,但我们需要一个永久性的解决方案,而不是用户可以避免的东西。实际上,启动器已经删除了按钮,但我们应用程序的活动会再次将它们放回去...也许我们可以尝试避免活动重置按钮(虽然不知道如何做到)。 - Filnik
包括沉浸模式,看看这个。http://developer.android.com/training/system-ui/immersive.html - Mightian
安卓设备所有者设置失败了吗? - Mightian
我还没有理解... :( - Filnik
看看这个 https://github.com/googlesamples/android-DeviceOwner 我认为这应该是一个起点。 - Mightian
显示剩余2条评论

1

尝试使用Android for work APIs这里。使用这些API,您可以完全控制设备并禁用任何想要的内容。该设备只能用于单个应用程序。

企业拥有的单一用途(COSU)是共享或特殊用途设备的企业责任场景的子集。与与个人员工相关联的企业责任设备不同,COSU设备与特定的业务功能相关联。例如,COSU设备可能用作信息亭。

您还可以尝试集成由OEM / MDM供应商/ MDM合作伙伴(如三星,HTC,Airwatch等)提供的自定义MDM(移动设备管理)解决方案。它也适用于早期的Lollipop版本,并提供更多的API来控制设备,而不是默认的Android解决方案。

我知道三星的MDM/Knox解决方案很好,它具有控制设备的每个部分的API。参考- http://www.samsung.com/levant/business/solutions-services/mobile-solutions/security/mobile-device-management。他们有类似于COSU的展示模式。

谢谢你的提示。看起来这是最好的答案,但我必须检查它是否适用于棒棒糖版本。正在努力中 :) - Filnik
我必须等待谷歌的答复 :( 我们会看看他们是否及时回答。 - Filnik
@Filnik 我猜它也适用于棒棒糖。否则,如果可行的话,您可以尝试OEMS/其他供应商提供的解决方案。我也更新了答案。 - rupesh jain
不确定这是否有效。我已经请求获取Android Work的访问权限..但仍然没有回复。谢谢您的答复。 - Filnik

0

您将向用户请求权限。在这种情况下,用户是您自己。请注意,您必须实现一种从应用程序中返回的方法。

参考:disable home

或者您可以购买一个外壳来贴在周围,这样按钮就不会可见...


不幸的是,那个解决方案并不是永久的...对吧?我们应该避免用户再次启用导航栏。 - Filnik
我们尝试在启动器中实现“按钮移除”。实际上,在主屏幕上它起作用了,但是当我们启动应用程序时,按钮又出现了。真是让人困惑啊!哈哈 :) 虽然如此,还是感谢您的帮助!为了防止客户退出唯一的应用程序,我们打算向客户销售没有主页和导航按钮的平板电脑。 - Filnik
你应该找设备的卖家来询问。你不应该购买平板电脑并进行调整后再出售。而且你为什么要这样做呢? - SamuelD
已经完成,目前我们正在请求定制一个没有导航栏和主页按钮的版本,但如果我们找到更简单的解决方案,我们将使用它。 - Filnik
让我们在聊天中继续这个讨论 - SamuelD
显示剩余2条评论

0
我已经尝试了很长一段时间并进行了大量搜索,但正如您所知道的那样,HOME按钮是用户在任何情况下退出任何应用程序的唯一途径。阻止它非常危险,而且谷歌不会允许这样做。
您可以做的一件事是将您的应用程序设置为启动器应用程序,然后您就可以接收Home键事件。

这里强烈反对仅提供链接的答案,因为链接可能在未来失效。建议您编辑答案并引用您引用的来源。 - Anirudh Sharma

0

当然,您不能删除任何系统按钮,如电源、音量+/-、主页、返回或菜单。您只能隐藏或显示主页、返回或菜单,但仅当它们是虚拟的(与实体按钮相反)。

同时,隐藏导航栏是有限制的。它只能在Android 4.0及更高版本上完成。因此,如果您想要这样做,您需要使用SYSTEM_UI_FLAG_HIDE_NAVIGATION标志。以下代码片段可以隐藏导航栏和状态栏:

View decorView = getWindow().getDecorView();
// Hide both the navigation bar and the status bar.
// SYSTEM_UI_FLAG_FULLSCREEN is only available on Android 4.1 and higher, but as
// a general rule, you should design your app to hide the status bar whenever you
// hide the navigation bar.
int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
              | View.SYSTEM_UI_FLAG_FULLSCREEN;
decorView.setSystemUiVisibility(uiOptions);

如果您想让应用程序的内容出现在导航栏后面,您需要使用SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION标志。您还可能需要使用SYSTEM_UI_FLAG_LAYOUT_STABLE来帮助您的应用程序保持稳定的布局。


0

使用沉浸模式,在onResume()中使用此代码,这样每次返回到您的活动时都会运行它们并隐藏它们

View decorView = getWindow().getDecorView();
decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                          | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                          | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                          | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                          | View.SYSTEM_UI_FLAG_FULLSCREEN
                          | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);

是的,但这并不是固定的。用户可以从中逃脱。 - Filnik

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