禁用电源按钮...或...在Android幼儿应用中恢复全屏

时间:2012-02-23 20:41:28

标签: android button fullscreen children

我正在为幼儿创建一个Android应用。因此,我需要锁定尽可能多的按钮,以防止幼儿访问Android设备的其他功能。基本上,我希望在流行的幼儿应用程序中重现锁定机制,如“幼儿锁”。我有逻辑要求用户以顺时针方式点击屏幕的四个角以退出应用程序。

要在全屏显示应用程序,我的清单中有以下内容

android:theme="@android:style/Theme.NoTitleBar.Fullscreen"

要仅以横向模式显示应用,我在我的活动的onCreate事件中有以下内容

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

为了防止使用任何按钮,我使用以下代码覆盖onKeyDown事件

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    return true;
}

一切都很好。到现在为止还挺好。只有一个按钮我似乎无法禁用...电源按钮。我在假设没有办法禁用电源按钮的情况下运行。如果我错了,请告诉我。所以,我需要弄清楚如何处理。显然,如果电源按钮被按住并且设备断电,那么我无能为力。但是,如果点击电源按钮关闭屏幕然后再次点击以重新打开屏幕,我希望能够适当地处理它。

正在发生的事情是应用程序恢复运行,但它不再是全屏幕。将显示通知栏。因此,我可以将其下拉并访问Android的其他区域。

为什么在Android设备上唤醒屏幕会导致通知栏显示在如上所述配置的全屏应用上...以及如何阻止它?

2 个答案:

答案 0 :(得分:2)

如果问题是布尔值:是否可以覆盖POWER按钮?答案是肯定的。 请记住,我没有说任何关于应该或不应该选择这种行为的背景,或者这种情况会使你受益于你想要实现的目标!

在非根电话(至少2.3.5和2.3.6)上覆盖电源按钮是可能的!如果您不相信我,那么只需从Google Play下载Theft Aware免费应用程序(AVAST获得之前的版本)并自行查看。我在非root的三星Galaxy Y(android 2.3.6)和HTC Wildfire-S(android 2.3.5)上进行了测试。

我不是说它可能使用公开记录的Android API,但它可能在非根工厂的android固件(至少2.3.5和2.3.6,如果不是其他人)。可能是Theft Aware的人可能已经熟悉操作系统级别/ Reverse Engineered it或深入挖掘源代码并且可能已经想出了一些覆盖电源按钮的方法,但他们绝对做得非常出色。

这是他们的知识产权,这就是没有关于他们如何做到的文件或论文或论坛讨论解决方案的原因。过去两周我一直试图弄明白自己。尚未成功,但如果他们能够做到......意味着,它可以完成!

厌倦了阅读它无法完成,因此答案。继续寻找,如果有人发现这个技巧,请发布!

P.S:我不是说这是件好事。我并不是说你应该禁用电源按钮并最终得到一个糟糕的用户体验应用程序。答案只是STATE覆盖POWER按钮是可能的!

答案 1 :(得分:1)

好的,经过几次谷歌搜索和试用/错误排除后,我终于找到了这个问题的答案。如果您正在尝试制作一个锁定所有按钮的Android应用程序,以便幼儿无法访问设备的其他区域,请执行以下操作...

在清单中,将以下内容添加到您的活动中。这会导致您的活动全屏显示:

android:theme="@android:style/Theme.NoTitleBar.Fullscreen"

同样在清单中,添加以下行。这样,您的活动就可以控制当设备的屏幕关闭然后重新打开时是否显示锁定屏幕:

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

在您的活动中,导入以下内容。这使您可以访问keygaurd管理器,以防止出现锁定屏幕:

import android.app.KeyguardManager;

在活动的类定义中,添加以下两个变量。这些允许keygaurd管理员被onCreate(...)onPause(...)onResume(...)事件使用(见下文)。

KeyguardManager keyguardManager;
KeyguardManager.KeyguardLock lock;

在您的活动的onCreate(...)事件中,添加以下代码。这将键锁控件分配给上面定义的类变量,并防止在屏幕关闭然后重新打开(按下电源按钮)时出现锁定屏幕:

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

在您的活动的onPause(...)事件中,添加以下代码。如果您的活动失去焦点,这会重新启用keygaurd锁定,例如当用户输入正确的代码退出锁定的应用程序时(例如按顺时针方向按下四个角落)。

lock.reenableKeyguard();

在您的活动的onResume(...)事件中,添加相关代码。当您的应用从关闭的屏幕恢复时,这会再次禁用按键锁定屏幕。

lock.disableKeyguard();

这就是它的全部内容。