【问题标题】:Not able disable Home button on specific android devices无法禁用特定 Android 设备上的主页按钮
【发布时间】:2012-04-27 11:21:38
【问题描述】:

我知道这个问题已经被问过很多次了,答案总是“不,我们不能禁用主页按钮”。

我有一点不同的问题要问。

我编写了简单的代码,其中我的活动覆盖 onKeyDown() 并为所有按键返回 true。

从理论上讲,这意味着打开应用程序的人会被卡在那里,并且无法选择退出应用程序。

当我在不同的设备上测试这个应用程序时,我做了以下观察:

  1. 在操作系统为 2.2.2 的摩托罗拉设备上,主页按钮被禁用。
  2. 在操作系统为 2.3.5 的 HTC 设备上,主页按钮被禁用。
  3. 在 OS 为 2.3.7 的 Sony 上,主页按钮被禁用。
  4. 在 OS 为 2.2.1 和 2.3.3 的三星上,主页按钮被禁用。
  5. 在 OS 为 2.3.6 和 4.0.4 的三星上,主页按钮保持启用状态。

这些观察结果似乎非常矛盾。

有没有人知道为什么不同的设备表现不同以及处理这种情况的最佳方法是什么。

据我了解,到目前为止,还没有供应商定制过 Android 操作系统。每个人都在上面放置 UI 层,但没有人触及内部。

【问题讨论】:

    标签: android android-homebutton


    【解决方案1】:

    我知道这个问题已经被问过很多次了,答案总是“不,我们不能禁用主页按钮”。

    如果要处理 HOME 按钮,请实现主屏幕。

    有人知道为什么不同的设备表现不同

    因为它们是不同的设备,并且供应商进行了更改。此外,在 4.0.4 的情况下,可能已经添加了额外的保护,以帮助防止恶意软件作者劫持 HOME 按钮而不是主屏幕。

    处理这种情况的最佳方法是什么

    如果要处理 HOME 按钮,请实现主屏幕。

    每个人都在上面放置 UI 层,但没有人触及内部。

    这是不正确的。几乎每个设备供应商都在不同程度上“触及了内部”。只要他们在 Play 商店中遇到 the compatibility requirements,他们的更改就会被 Google 接受。

    【讨论】:

    • 嗨@CommonsWare,我同意你所说的一切。但如果是这样,那么为什么某些应用程序(如幼儿锁)能够在不将其应用程序转换为主屏幕应用程序的情况下禁用主屏幕按钮??我还可以通过实现主屏幕来禁用主页按钮,但是提示选择应用程序来完成操作会导致问题。如果我选择我的应用程序,则可以,但如果我选择除主页按钮之外的任何其他应用程序,则开始在我的应用程序中工作。幼儿锁以某种方式能够绕过此功能...
    • @dexprab:幼儿锁是一个主屏幕,我上次检查过。如果它具有您描述的功能,则需要关闭幼儿锁利用的安全漏洞。
    • 我不认为有任何安全漏洞,因为该应用程序具有基于模式的高效注销机制。它也被列为许多网站上最好的应用程序之一。我猜如果这是一个安全故障,谷歌可能已经调查过了。即使它是我真的很想知道他们是如何做到的。我有他们的清单,但它对我实现功能没有多大帮助
    • @dexprab:欢迎您提出意见。有一天,如果恶意软件接管了你的设备并阻止你离开恶意软件,因为它接管了 HOME 按钮,你会改变主意。我正在努力帮助防止此类恶意软件。
    【解决方案2】:

    您可能想尝试一下:

    @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" />
    

    【讨论】:

    • 成为launcher App后添加正确答案。通过在用户离开时返回活动来禁用返回按钮、任务管理器按钮和通知栏交互
    【解决方案3】:

    正如我在问题本身中提到的,对于 2.3.6 以下操作系统覆盖 keypress() 函数的设备运行良好。

    问题从 2.3.6 开始。我不知道这些设备供应商做了什么,但keypress() 功能在所有设备上的功能并不相同。

    同样从 ICS 开始,谷歌已经停止使用 keypress() 函数了。

    那么我们该怎么做呢。

    在我看来,如果我们试图覆盖主页按钮,那么这是不可能的,但我们绝对可以听。

    在我们的 android 清单中,我们使用&lt;category android:name="android.intent.category.HOME" /&gt; 过滤器,这使得我们的活动成为家庭替换屏幕。 现在,当您按下主页按钮时,内容解析器弹出窗口将始终出现并询问哪个应用程序,即默认启动器或您的应用程序应该响应主页按钮单击。您可以随时在此处选择您的应用程序。

    但这不会覆盖或禁用主页按钮。每当您按下主页按钮时,都会一次又一次地重复相同的操作,直到您将应用程序设置为默认值,方法是单击内容解析器弹出窗口中给出的用作默认复选框。

    现在,一旦您选择了您的应用程序作为默认主页,新闻将始终启动您的应用程序。

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

    我们要做的是在关闭或调用我们的活动的完成()之前,我们应该使用以下方法将包设置设置为默认值:

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

    这将使主页按钮与您的活动解除关联。

    【讨论】:

    • 我认为“禁用主页按钮”的一部分是为了防止“使用完成操作”对话框。如果用户在对话框中选择默认的 android 启动器,您将无法再处理主页按钮。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多