对于有些应用需要在某些时候屏蔽掉系统的锁屏,当然这里面的屏蔽系统锁屏指的是用户没有设置pin、图案、数字等密码的情况,一般这种情况我们是屏蔽不了的,这里屏蔽的锁屏是指「无密码的情况下」
1、KeyguardManager.KeyguardLock
1、KeyguardManager这是系统提供的管理系统锁屏的,基本关于锁屏的一些操作都有直接对应的方法,例如判断是否锁屏、判断是否安全模式、不允许系统锁屏、重新授予锁屏等方法。但是屏蔽锁屏我们用的 KeyguardManager.KeyguardLock 这个类的 disableKeyguard() 方法。不过特别说明一下,这个类在api13就被抛弃掉了,所以在版本是需要做兼容。
KeyguardManager keyguardManager = (KeyguardManager) context.getSystemService(Context.KEYGUARD_SERVICE);
KeyguardManager.KeyguardLock keyguardLock = keyguardManager.newKeyguardLock(ONLYLOCK);
keyguardLock.disableKeyguard();
2、通过设置顶层窗口的flag来屏蔽系统锁屏
1、这个方法,主要靠的activity去过去当前最顶层的窗口,去设置flag来达到屏蔽锁屏的方法,也是谷歌目前建议的方法。其实也是设置悬浮窗的属性啦,这一块熟悉悬浮窗属性的同学,应该不陌生,我直接上代码吧。注意:设置窗口的flag,要在setContentView之前设置哦,否则不生效。
private void setKeyguardEnable(boolean enable) {
//disable
if (!enable) {
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD |
WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
return;
}
//enable
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD |
WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
}
3、利用系统隐藏的方法类
1、其实如果你有用了上面的两个方法,去屏蔽系统锁屏,你会发现,这两个方法对大部分机型是可行的,但是还是有一部分机型,屏蔽不成功。下面介绍的第三种方法,虽然不太建议,但是确实能比上述两个方法,效果更好。那就是利用系统hide的类和方法。
2、细心的同学会发现 KeyguardManager 里面真正起作用的是 IWindowManager 的类,但是我们看不了 IWindowManager 里面的代码,这是因为 google 把这个类隐藏掉了,但是我们去 GitHub 上找,还是能找到这个类的源码。找到源码,我们可以看到这个 IWindowManager 类里面有个 dismissKeyguard() 的方法。
3、既然知道这个隐藏类,有这个 dismiss 锁屏的方法,要怎么调用呢?我们需要把这个类的源码 copy 到我们的项目中,注意包名一定要跟源码的一致。(大家也可以,依赖这个开源库,这个库是吧 google 隐藏的代码,全部开放,不过这个直接依赖,要注意使用到的隐藏的类,日后有可能被 google 抛弃,所以可能会有风险,库的地址 : https://github.com/anggrayudi/android-hidden-api)
4、代码,通过反射出这个类,然后再使用里面的方法
public static void dismissKeyguard() {
if ((Build.VERSION.SDK_INT >= 18) && (Build.VERSION.SDK_INT <= 25)) {
try {
Class<?> mClass = Class.forName("android.view.WindowManagerGlobal");
Method window = mClass.getMethod("getWindowManagerService");
IWindowManager mIWindowManager = (IWindowManager) window.invoke(mClass);
mIWindowManager.dismissKeyguard();
} catch (Exception e) {
e.printStackTrace();
}
}
}
4、最后
1、千万不要忘了在AndroidManifast.xml里面加入权限声明:
<uses-permission android:name="android.permission.DISABLE_KEYGUARD"/>