1

我注意到我无法解释的 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();

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

4

2 回答 2

0

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

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

于 2014-11-13T11:28:28.890 回答
0

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

这是代码:

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" />

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

于 2016-05-04T12:42:01.340 回答