对于有些应用需要在某些时候屏蔽掉系统的锁屏,当然这里面的屏蔽系统锁屏指的是用户没有设置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"/>
Logo

快速构建 Web 应用程序

更多推荐