我正在开发一个警报应用程序。从主要活动我使用广播设置闹钟。然后在广播接收器中的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);
这适用于三星Galaxy S2与android 2.3.4,但不适用于htc与android 2.3.5。在HTC它没有做任何事情,当我按下锁定按钮屏幕自动解锁而没有我拖动圆圈。就像flag_dissmiss_keygard一样,但是flag_turn_screen_on不是。这样做还有另一种方法或其他方法吗?
答案 0 :(得分:14)
我开始时和你一样,窗口标志不起作用。
我终于通过使用两个Android服务来实现它:KEYGUARD_SERVICE
和POWER_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_KEYGUARD
和WAKE_LOCK
答案 1 :(得分:3)
这是解决方案
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();
答案 2 :(得分:1)
我的应用程序也遇到了很多问题。实际上,当用户按两次后退按钮时,我想要屏幕锁定。用户按下主页按钮时解锁。
解锁设备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();