安卓 - 是否可能禁用主页按钮的点击?

61

我有一个应用程序,当它启动时,我需要在Android设备上禁用所有按钮,我已经成功禁用了挂断和其他按钮。我现在需要禁用 HOME 按钮的点击操作,点击 HOME 按钮不应该产生任何作用。

非常感谢任何建议。


4
我同意你的评论,但我的要求是真实的。应用程序有一些默认操作,我称之为智能共享我的手机。比如,当我将手机交给孩子时,它应该能够在一个点击中执行我在应用程序中设置的所有操作,而不会在未经我的许可的情况下终止应用程序。你应该提供认证来终止应用程序。 - Vinayak Bevinakatti
1
一个很好的例子是Toddler Lock。 - Jay Askren
@Jay Askren,是的,这是一个很好的例子。你有关于这个代码提示的任何想法吗? - Vinayak Bevinakatti
很抱歉,我没有。 - Jay Askren
2
@JohnFeminella:你考虑的是个人设备上的安卓,但如果是企业设备呢?你不想让用户在各种选项中浪费时间,只希望他们使用一个应用程序。 - m0skit0
我认为你可以在这里找到答案:https://dev59.com/2WMm5IYBdhLWcg3whfSe#23349558 - Lê Quang Duy
6个回答

29

我非常确定Toddler Lock只是使用BroadcastReciever并侦听Intent.ACTION_MAIN和类别Intent.CATEGORY_HOME - 这就是为什么当您第一次启动它时,它会告诉您要勾选“将此应用程序用作默认值”框,并让您选择幼儿锁的原因。

因此,它实际上根本没有阻止Home按钮,它只是将自己设置为以下内容的默认广播接收器:

Intent i = new Intent(Intent.ACTION_MAIN);
i.addCategory(Intent.CATEGORY_HOME);

当你启动幼儿锁时,它可能会设置一个内部标志。如果你按下主屏幕按钮,它只是将窗口置于前台。如果该标志未设置,则可能会显式地启动启动器。

我希望这样说有意义。这只是一个理论,但我几乎可以确定这就是实现方式。


6
抱歉对这个旧帖进行评论,但是需要澄清一些混淆的地方——你不能通过广播接收器接收“startActivity() Intents”。然而,另一个活动可以声明自己是HOME活动,这将允许用户在按下HOME按钮时选择一个主屏幕实现。 - CommonsWare

18

在你的活动中添加以下代码:

@override

public void onAttachedToWindow()
{  
       this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);     
       super.onAttachedToWindow();  
}

编辑:

这在所有旧版本的Android中都有效。 但不会ICS和jelly bean中工作,并且会导致应用程序崩溃。

这个Android应用程序中的这4行Java代码是什么意思?


虽然这个方法可以禁用主页按钮,但在我的情况下它会在我的活动上方弹出锁屏。我正在尝试制作一个锁屏替代品,因此需要禁用主页按钮。 - Josh
有趣的@Josh,你用什么手机?我用的是Droid Incredible和Aria。还有,你用的是什么操作系统?我这里是2.2。 - Idistic
我在我的Thunderbolt上进行了测试,它已经root并运行着CM7(2.3.4)。 - Josh
在我的 Acer 平板电脑上运行了 3.1。 - shanabus
6
幸运的是,这个安全漏洞已经在较新版本的安卓系统中修复了。 - CommonsWare

11

将以下代码添加到您的主Activity的manifest.xml文件中:

<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
<category android:name="android.intent.category.HOME" />

按下HOME键将始终重新启动您的活动。 适用于Froyo。


2
我给了+1,因为它防止退出,但它让我选择我的应用是否是默认启动器?Acer平板电脑3.1 - shanabus
1
这是一个糟糕的解决方案,它只会将您的应用程序标记为启动器。人们可能会错误地将默认启动器与您的应用程序切换。您不希望发生这种情况。 - zeh

5

我找到了解决HOME键的方法。对于您的应用程序,请将清单设置为:

<action android:name="android.intent.action.MAIN" /> 
<category android:name="android.intent.category.HOME" /> 
<category android:name="android.intent.category.DEFAULT" />                            
<category android:name="android.intent.category.MONKEY"/>

现在您的应用程序是一个替代启动器应用程序。

使用adb,并使用软件包管理器禁用启动器应用程序

pm disable com.android.launcher2

现在,按下Home键将始终停留在同一屏幕上。


我知道这是一个非常老的问题,但为什么这与运行时环境问题有关呢?我不确定您是否可以编程方式禁用启动器(如果可以的话,会感到惊讶),甚至是否应该这样做。 - Idistic
这个答案似乎没有帮助,抱歉。 - shanabus
实际上,它可以工作,但需要系统特权。与其使用adb禁用默认启动器,还可以在code上完成。 - Yeung
这个命令 'pm disable com.android.launcher2' 是错误的:Error: java.lang.IllegalArgumentException: Unknown package: com.android.launcher。 - AmyNguyen

5

这里你可以找到我的Android示例应用程序,它持续存在于主页上。 Home、Back、Call、Power按钮都被禁用了。 用户只能通过输入密码来结束应用程序。


3
当用户完成此应用程序时,必须选择默认的主页管理器。如果你只想禁用自己应用程序的按钮而不影响启动器,那么这句话并不是很有用。 - Johann
6
最好是将相关代码直接粘贴到答案中,而不是让人们打开压缩文件并搜索代码。 - Chloe
无关的回答...这个应用程序搞乱了主屏幕启动器按钮。 - Srikanth Pai

2
在Jeffreys的帖子中,我有一个进一步的补充,这是对我有效的东西(仍然允许半透明主题)。
@Override
public void onAttachedToWindow()
{  
    this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG);     
    super.onAttachedToWindow();  
}

因为它会使得键盘保护程序弹出,所以您可以在应用程序正在使用时禁用键盘保护程序:

KeyguardManager keyguardManager = (KeyguardManager)getSystemService(KEYGUARD_SERVICE);
KeyguardLock lock = keyguardManager.newKeyguardLock(KEYGUARD_SERVICE);
lock.disableKeyguard();

这对于制作自己的键盘锁应用程序非常有效。


嗨,这似乎对我的问题有用。你能帮我看一下这个链接吗?https://dev59.com/OGTWa4cB1Zd3GeqPCl50? - Mario Lenci
这个方案有一个副作用。我的活动应该占满整个屏幕。使用您上面的代码将其还原为正常屏幕大小,暴露出Android的状态栏,因此打开了一个安全漏洞,任何用户可能通过状态栏进入某些其他部分的应用程序。 - Johann

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