目录
5.KeyguardLock的disableKeyguard使用限制:
1.Manager获取方法:
import android.app.KeyguardManager;
KeyguardManager manager = context.getSystemService(Context.KEYGUARD_SERVICE);
2.方法详解:
- newKeyguardLock 可以通过KeyguardLock显示锁屏和隐藏锁屏
KeyguardLock方法:
disableKeyguard 禁用锁屏功能
reenableKeyguard 恢复锁屏功能
权限:Manifest.permission.DISABLE_KEYGUARD
- isKeyguardLocked 返回点前是否处于锁屏的状态 true:锁屏 false:已解锁
- isKeyguardSecure 是否设置了锁屏密码 true:有锁屏密码(包含SIM卡锁) false:未设置
- inKeyguardRestrictedInputMode 是否处于限制输入模式 true:不响应home键和右软件 false:功能正常
- isDeviceLocked 设备是否锁定,功能类似 isKeyguardLocked 多用户接口
- isDeviceSecure 功能类似isKeyguardSecure 多用户接口
- requestDismissKeyguard 解锁接口 若设置了锁屏密码需要用户输入正确的密码,若未设置则可以直接解锁
- exitKeyguardSecurely 解锁接口(无论是否设置了锁屏密码都可以解锁需要获取Manifest.permission.DISABLE_KEYGUARD权限)
3.KeyguardManager方法执行流程图:
整个执行流程方法调用很清晰,参考流程图和源代码可以快速理解,这里就不在详细解读了。只要注意一点:KeyguardService和KeyguardViewMediator这个2个属于SystemUI模块。其他的属于Framework。
4.KeyguardLock中方法执行流程:
执行流程主要区别就在于在WindowManagerService和PhoneWindwManager之间增加了Handler异步处理机制,大致流程如下:
5.KeyguardLock的disableKeyguard使用限制:
所有APP申请了权限都可以调用响应的方法禁用和恢复锁屏功能,若锁屏设置了密码,也就是说isKeyguardSecure方法返回值是true,只有系统APK的功能正常,其他APK执行不报错,但功能不好使。
WindowManagerService中disableKeyguard方法中的限制:
// If this isn't coming from the system then don't allow disabling the lockscreen
// to bypass security.
if (Binder.getCallingUid() != SYSTEM_UID && isKeyguardSecure()) {
Log.d(TAG_WM, "current mode is SecurityMode, ignore disableKeyguard");
return;
}
6.isKeyguardLocked注意项:
在锁屏状态下调用disableKeyguard隐藏掉锁屏后,调用isKeyguardLocked方法获取的状态为true,虽然此时锁屏没有显示,正常操作也是正常的,但此时Framework的状态是处于锁屏状态的。
首先看看disableKeyguard的具体操作,具体在
/frameworks/base/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java的 setKeyguardEnabled方法中看看,
在锁屏mShowing状态为true时,禁用锁屏,会将mNeedToReshowWhenReenabled的状态置为true.
这个状态是记录禁用锁屏时,锁屏是否处于显示状态,若处于显示,恢复锁屏功能时,要将锁屏显示出来。
在调用isKeyguardLocked方法时最终会调用到KeyguardViewMediator.java的isInputRestricted方法中
最终这个mNeedToReshowWhenReenabled状态就会影响isKeyguardLocked的结果。
7.DISABLE_KEYGUARD权限的定义:
level级别是最低的normal级别,也就所所有的应用都可以申请这个权限。