无法禁用特定Android设备上的主页按钮

4
我知道这个问题被问过很多次,答案总是“不,我们不能禁用主页按钮”。
我有一个稍微不同的问题要问。
我写了一段简单的代码,在其中,我的活动覆盖了onKeyDown()并返回所有按键的true值。
理论上,这意味着打开应用程序的人会被困在那里,没有任何选择可以退出应用程序。
当我在不同的设备上测试这个应用程序时,我做了以下观察:
1. 在运行2.2.2操作系统的摩托罗拉设备上,主页按钮被禁用了。 2. 在运行2.3.5操作系统的HTC设备上,主页按钮被禁用了。 3. 在运行2.3.7操作系统的索尼上,主页按钮被禁用了。 4. 在运行2.2.1和2.3.3操作系统的三星上,主页按钮被禁用了。 5. 在运行2.3.6和4.0.4操作系统的三星上,主页按钮仍然启用。
这些观察结果看起来非常矛盾。
有没有人知道为什么不同的设备表现不同,以及如何处理这种情况的最佳方法。
据我目前的理解,现在没有任何供应商定制Android OS。每个人都将自己的UI层放在其上,但没有人触及内部。
3个回答

7
我知道这个问题已经被问了很多次,答案总是“不,我们不能禁用主页按钮”。 如果您想处理主页按钮,请实现主屏幕。
有人有任何想法,为什么不同的设备表现不同吗? 因为它们是不同的设备,供应商进行了更改。此外,在4.0.4的情况下,可能已添加了其他保护措施,以帮助防止恶意软件作者在没有成为主屏幕的情况下劫持主页按钮。
如何处理这种情况最好的方法是什么? 如果您想处理主页按钮,请实现主屏幕。
每个人都将其UI层放在其上面,但没有人触及内部。 这是不正确的。几乎每个设备供应商都以不同程度地“触及了内部”。只要他们符合Play Store的兼容性要求,他们的更改就被认为是可接受的。

嗨@CommonsWare,我同意你所说的一切。但是如果是这样的话,为什么像Toddler lock这样的某些应用程序能够在不将其应用程序转换为主屏幕应用程序的情况下禁用主屏幕按钮?我也可以通过实现主屏幕来禁用主按钮,但是选择一个应用程序以完成操作的提示会引起问题。如果我选择我的应用程序,那就没问题了,但是如果我选择任何其他应用程序,则主按钮会在我的应用程序中开始工作。Toddler lock已经成功地绕过了这个功能... - dexprab
@dexprab:据我所知,Toddler Lock是一个主屏幕。如果它具有您描述的功能,则需要关闭Toddler Lock利用的安全漏洞。 - CommonsWare
我不认为这个应用存在任何安全漏洞,因为它具有高效的基于模式的注销机制,并且在许多网站上被列为最佳应用之一。如果真的存在安全漏洞,我相信谷歌已经深入研究过了。即使是这样,我也非常有兴趣知道他们是如何做到的。我手头有他们的清单,但它并没有对我实现功能起到太大的帮助。 - dexprab
1
@dexprab:欢迎您发表意见。如果有一天恶意软件接管了您的设备,并阻止您离开该软件,因为它接管了HOME按钮,那么您会改变您的想法。我正在努力帮助预防这种恶意软件。 - CommonsWare

6
你可以尝试一下这个:
@Override
public void onBackPressed() {

}

@Override
protected void onUserLeaveHint() {
    super.onUserLeaveHint();
    ((ActivityManager) getApplicationContext().getSystemService(Context.ACTIVITY_SERVICE)).moveTaskToFront(getTaskId(), 0);
}

@Override
protected void onPause() {
    super.onPause();
    ((ActivityManager) getApplicationContext().getSystemService(Context.ACTIVITY_SERVICE)).moveTaskToFront(getTaskId(), 0);

}

所需权限--将以下内容添加到清单中

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

在成为启动器应用程序后,需要添加正确的答案。通过返回到活动,每当用户离开它时,禁用返回按钮、任务管理器按钮和通知栏交互。 - hannunehg

0
如在我的问题中提到的,在2.3.6以下操作系统的设备上,覆盖keypress()函数是有效的。
从2.3.6开始出现了问题。我不知道这些设备制造商做了什么,但是keypress()函数在所有设备上的功能都不同。
此外,从ICS开始,Google已经彻底停止使用keypress()函数。
那么我们该怎么办呢?
我认为,如果我们想要覆盖主页按钮,那么这是不可能的,但我们肯定可以监听它。
在我们的Android清单文件中,我们使用<category android:name="android.intent.category.HOME" />过滤器,这使得我们的Activity成为主屏幕的替代者。 现在,当您按下主页按钮时,内容解析器弹出窗口将始终弹出并询问哪个应用程序即默认启动器或您的应用程序应对主页按钮点击作出响应。您总是可以在那里选择您的应用程序。
但这并不会覆盖或禁用主页按钮。每当您按下主页按钮时,相同的事情都会一遍又一遍地重复,直到您点击内容解析器弹出窗口中给出的“使用作默认值”复选框,将您的应用程序设置为默认值。
现在,一旦您选择了您的应用程序作为默认主页,按主页按钮将始终启动您的应用程序。

完成了...不对。现在出现的问题是,如果您退出应用程序,主页按钮仍会启动您的应用程序。如何在完成工作后摆脱它。

我们需要做的是,在关闭或调用finish()之前,使用以下方法将包设置为默认值:

paramPackageManager1.setComponentEnabledSetting(localComponentName2, PackageManager.COMPONENT_ENABLED_STATE_DEFAULT, 1);

这将取消关联主页按钮与您的活动。


2
我认为“禁用主页按钮”的部分应该是为了防止“使用以下完成操作”对话框的出现。如果用户在对话框中选择默认的Android启动器,您将无法再处理主页按钮。 - MikeL

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