【问题标题】:Disable power button... or... Resume full screen in Android toddler app禁用电源按钮...或...在 Android 幼儿应用程序中恢复全屏
【发布时间】:2012-03-14 07:45:36
【问题描述】:

我正在为幼儿创建一个 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 设备上的屏幕会导致通知栏出现在按上述配置的全屏应用上...以及如何防止它?

【问题讨论】:

  • 尝试在清单中设置您的方向,而不是通过 Java 代码。
  • 感谢您的建议。我从 onCreate 事件中删除了 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 行,而是将 android:screenOrientation="landscape" 添加到我的清单中。但是应用程序的行为仍然相同。唤醒后通知栏仍然显示。

标签: android button fullscreen children


【解决方案1】:

如果问题是布尔值:是否可以覆盖电源按钮?答案是肯定的。 请记住,我并不是在说应该或不应该选择这种行为的背景,或者这种情况对你想要实现的目标有什么好处!

在非 root 手机(至少 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,但它可以在非 root 的工厂 android 固件上实现(如果不是其他版本,至少是 2.3.5 和 2.3.6)。可能是 Theft Aware 的人可能已经迷上了操作系统级别/对其进行了逆向工程,或者深入研究了源代码并可能想出了某种方法来覆盖电源按钮,但他们做得非常出色。

这是他们的 IP,这就是没有关于他们如何做到这一点的文档、论文或论坛讨论解决方案的原因。在过去的两周里,我一直试图自己弄清楚。还没有成功,但如果他们能做到……意味着,它可以完成!

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

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

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

    import android.app.KeyguardManager;
    

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

    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();
    

    仅此而已。

    【讨论】:

      猜你喜欢
      • 2011-05-15
      • 2011-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-02
      • 2012-07-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多