最近接了个私活,涉及到屏幕解锁,由于从来没接触过这块方面的知识,网上找了很多相关的内容,基本上都是以
private PowerManager.WakeLock wl;
private KeyguardManager keyguardManager;
public static KeyguardLock keyguardLock;
wl = powerManger.newWakeLock(PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.SCREEN_DIM_WAKE_LOCK, "bright");
keyguardManager = (KeyguardManager)getSystemService(KEYGUARD_SERVICE);
keyguardLock = keyguardManager.newKeyguardLock("");
keyguardLock.disableKeyguard();
keyguardLock.reenableKeyguard();
拿到屏幕锁持有并清除,再释放为主。
但是这个思路有个缺点就是在你退出应用后,,系统会拿到你释放的屏幕锁并重新锁住屏幕,这就造成了不好的用户体验。
经过翻阅相关API 发现一个很有用的参数 :
WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
位于 package android.view.WindowManager.
其注释如下:
/** Window flag: when set the window will cause the keyguard to
* be dismissed, only if it is not a secure lock keyguard. Because such
* a keyguard is not needed for security, it will never re-appear if
* the user navigates to another window (in contrast to
* {@link #FLAG_SHOW_WHEN_LOCKED}, which will only temporarily
* hide both secure and non-secure keyguards but ensure they reappear
* when the user moves to another UI that doesn't hide them).
* If the keyguard is currently active and is secure (requires an
* unlock pattern) than the user will still need to confirm it before
* seeing this window, unless {@link #FLAG_SHOW_WHEN_LOCKED} has
* also been set.
*/
public static final int FLAG_DISMISS_KEYGUARD = 0x00400000;
大意为 这个窗口标志位 设置时该窗口会导致键盘锁在屏幕唤醒后要被解锁,这种用法只有当它不是安全的锁键盘锁(即非键盘输入或者手势解锁等等)。因为这种键盘锁不需要用于安全,它(键盘锁)将永远不会重新出现如果用户导航到另一个窗口(相对于 FLAG_SHOW_WHEN_LOCKED,这将只是暂时隐藏安全和非安全的 keyguards,但确保当用户移到另一个用户界面,并不掩饰他们的时候,它们又会出现)。如果键盘锁当前处于活动状态,并且是安全的 (需要屏幕解锁图案) 用户将仍然会看到解锁的窗口,除非还设置了 FLAG_SHOW_WHEN_LOCKED。
也就是说在android的基本锁屏中我们是可以利用这个特性进行屏幕解锁的。
在代码中的使用为:
在 oncreate()方法中,在你setContentView之前,
添加windows 的flags如下:
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON|WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD|WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.lockscreen);
即可在唤醒屏幕的同时将屏幕锁解开而且无后患。