【问题标题】:Programmatically turn screen on in android以编程方式在android中打开屏幕
【发布时间】:2012-04-01 17:23:52
【问题描述】:

我正在开发一个警报应用程序。在主要活动中,我使用广播设置了警报。然后在广播接收器的 onReceive 中,我调用使用户能够关闭或暂停闹钟的活动...在该活动中,在 onCreate 的开头,我使用此行来打开屏幕并解锁设备:

final Window win = getWindow();
    win.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
                  | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD); 
    win.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
                  | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);

这在带有 android 2.3.4 的三星 Galaxy S2 上完美运行,但不适用于带有 android 2.3.5 的 htc。在 htc 上它什么也不做,当我按下锁定按钮屏幕自动解锁而无需我拖动圆圈。它就像 flag_dissmiss_keygard 正在工作,但 flag_turn_screen_on 没有。有没有其他方法或解决方案可以做到这一点?

【问题讨论】:

标签: android android-alarms android-windowmanager


【解决方案1】:

我一开始和你很像,窗口标志并没有真正起作用。

我终于通过使用两个 Android 服务让它工作了:KEYGUARD_SERVICEPOWER_SERVICE

KeyguardManager km = (KeyguardManager) context.getSystemService(Context.KEYGUARD_SERVICE);
final KeyguardManager.KeyguardLock kl = km.newKeyguardLock("MyKeyguardLock");
kl.disableKeyguard();

PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
wakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP
        | PowerManager.ON_AFTER_RELEASE, "MyWakeLock");
wakeLock.acquire();

完成后不要忘记释放唤醒锁。

您需要请求权限DISABLE_KEYGUARDWAKE_LOCK

【讨论】:

  • 我在 Nexus One (2.3.6) 和 Nexus S (4.1.1) 上试过,效果很好。
  • 开发者们,求求你们:请不要这样做!!!只是想发出一个警告,即禁用键盘锁会按照它所说的那样做:它绕过任何 PIN 或图案解锁。尝试长按主页(姜饼)或应用程序切换按钮(ICS),你会明白我的意思。我在最流行的手机上使用布局参数没有任何问题,而且 Gingerbread 手机的数量每天都在下降。请重新考虑窗口标志!
  • 嘿@PatrickHorn,您能否指定一个绕过PIN 锁定屏幕的设备示例。在我的测试中,我可以向用户显示一个带有我想要的消息的屏幕,当用户尝试点击主页或切换应用程序时,他会获得输入 PIN 屏幕。所以这对我来说似乎足够安全。
  • 在用户为其设备创建安全锁的情况下(即通过使用 PIN 码、密码等),我会谨慎使用上述答案的 KeyguardLock#disableKeyguard() 部分,因为会“似乎”绕过他们设备上的屏幕锁定。此外,WindowManager#LayoutParams() 方法是一种即兴即用的方法,即使 Google 框架开发人员这么认为并且在 SO 中的其他帖子上也发表了这样的评论,它并不总是有效。
  • 很遗憾 FULL_WAKE_LOCK 现已弃用
【解决方案2】:

解决办法

WindowManager windowManager = (WindowManager) getApplicationContext().getSystemService(Context.WINDOW_SERVICE);
    WindowManager.LayoutParams params = new WindowManager.LayoutParams(
            LayoutParams.WRAP_CONTENT,
            LayoutParams.WRAP_CONTENT,
            LayoutParams.TYPE_SYSTEM_ALERT |
                    LayoutParams.TYPE_SYSTEM_OVERLAY,
                    LayoutParams.FLAG_NOT_TOUCH_MODAL |
                    LayoutParams.FLAG_SHOW_WHEN_LOCKED |
                    LayoutParams.FLAG_KEEP_SCREEN_ON|
                    LayoutParams.FLAG_DISMISS_KEYGUARD|
                    LayoutParams.FLAG_TURN_SCREEN_ON,
            PixelFormat.TRANSPARENT);

KeyguardManager km = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
    km.isKeyguardLocked();

    windowManager.addView(mTopView, params);
    getWindow().setBackgroundDrawable();

【讨论】:

  • 这需要任何许可吗?
  • 抱歉耽搁了,我已经在 AndroidManifest.xml 中授予了权限
  • 什么是 mTopView 以及对 km.isKeyguardLocked() 的调用是什么?
【解决方案3】:

我的应用程序也遇到了许多问题。实际上,当用户按两次后退按钮时,我想要屏幕锁定。并在用户按下主页按钮时解锁。

解锁设备 marmor 的代码是正确的。 :) 我用过这段代码。

PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 
                WakeLock wakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK
                                                 | PowerManager.ACQUIRE_CAUSES_WAKEUP
                                                 | PowerManager.ON_AFTER_RELEASE, "MyWakeLock");
                wakeLock.acquire();

【讨论】:

  • 在我的设备中,此解决方案仅打开屏幕但不解锁 android。我需要添加一些东西吗?
  • @Manza 使用 marmor 给出的以下答案中的代码。这也将解锁设备。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-02
  • 1970-01-01
  • 2017-01-29
  • 1970-01-01
  • 2015-01-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多