【问题标题】:KeyguardManager fails to unlock kitkat screenKeyguardManager 无法解锁 kitkat 屏幕
【发布时间】:2014-11-12 22:44:39
【问题描述】:

我注意到我无法解释的非常有趣的 Android 行为。我正在使用以下代码来唤醒手机并禁用键盘保护:

        PowerManager.WakeLock mFullWakelock = mPowerManager.newWakeLock(
                (PowerManager.SCREEN_BRIGHT_WAKE_LOCK |
                        PowerManager.FULL_WAKE_LOCK |
                        PowerManager.ACQUIRE_CAUSES_WAKEUP),
                LOCK_TAG
        );

        mFullWakelock.acquire();

        KeyguardManager keyguardManager = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
        KeyguardManager.KeyguardLock keyguardLock = keyguardManager.newKeyguardLock(LOCK_TAG);

        keyguardLock.disableKeyguard();

想象有一个唤醒循环(以编程方式)->禁用键盘保护(以编程方式)->按电源按钮(手动)->唤醒->禁用键盘保护。这个循环很好,直到我在手机的键盘保护被禁用时手动按下主页按钮。之后,手机确实会唤醒,但键盘保护不再以编程方式被禁用。如有任何想法,我将不胜感激!

【问题讨论】:

标签: android keyguard keyguardlock android-powermanager


【解决方案1】:

问题在于,每当用户按下主页按钮或打开通知时,键锁似乎就会过期。因此,无论何时发生这种情况,您都必须创建一个新的钥匙锁。

我使用了这个解决方案,效果很好: https://stackoverflow.com/a/14519861/4098821

【讨论】:

    【解决方案2】:

    我遇到了同样的问题,我使用反射解决了这个问题,并将我的应用程序作为系统签名的应用程序。

    代码如下:

    try{
                                       Class lockPatternUtilsCls = Class.forName("com.android.internal.widget.LockPatternUtils");
                                       Constructor lockPatternUtilsConstructor = 
                                           lockPatternUtilsCls.getConstructor(new Class[]{Context.class});
                                       lockPatternUtilsConstructor.setAccessible(true);
                                       Object lockPatternUtils = lockPatternUtilsConstructor.newInstance(ChangeDeviceLockMode.this);
                                       Method clearLockMethod = lockPatternUtils.getClass().getMethod("clearLock", boolean.class);
                                       clearLockMethod.setAccessible(true);
                                       Method setLockScreenDisabledMethod = lockPatternUtils.getClass().getMethod("setLockScreenDisabled", boolean.class);
                                       setLockScreenDisabledMethod.setAccessible(true);
                                       clearLockMethod.invoke(lockPatternUtils, false);
                                       setLockScreenDisabledMethod.invoke(lockPatternUtils, true);     
                                       Toast.makeText(ChangeDeviceLockMode.this,"none", Toast.LENGTH_LONG).show();  
                               }catch(Exception e){
                                   System.err.println("An InvocationTargetException was caught!");
                                                       Throwable cause = e.getCause();
                                                       Toast.makeText(ChangeDeviceLockMode.this,"none--"+cause, Toast.LENGTH_LONG).show();  
                                   Toast.makeText(ChangeDeviceLockMode.this,"none--"+e, Toast.LENGTH_LONG).show();  
                               }
    

    您还需要在清单中添加权限

    android:name="android.permission.ACCESS_KEYGUARD_SECURE_STORAGE" />
    

    此权限要求应用经过系统签名。

    【讨论】:

    • 确保您的应用程序是系统签名的,否则上述代码将无法工作
    • 如何获得系统签名?我正在开发一个锁屏应用程序,但是如果我在按下应用程序预览按钮后让键盘锁解锁,则 android 会显示黑屏。你遇到过这个问题吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多