KeyguardManager не может разблокировать экран kitkat

Я заметил очень интересное поведение 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();

Представьте, что есть цикл пробуждения (программно)-> отключить защиту клавиатуры (программно)-> нажать кнопку питания (вручную)-> пробуждение -> отключить защиту клавиатуры. Цикл работает отлично, пока я не нажму кнопку "Домой" вручную, пока отключена клавиатура телефона. После этого телефон просыпается, но клавиатура больше не отключается программно. Буду признателен за любые идеи!

2 ответа

Решение

Проблема заключается в том, что блокировка ключа, возможно, истекает всякий раз, когда пользователь нажимает кнопку "Домой" или открывает уведомление. Поэтому всякий раз, когда это происходит, вы должны создать новую блокировку клавиатуры.

Я использовал это решение, и оно отлично работало: /questions/40354661/otklyuchennaya-blokirovka-klaviaturyi-snova-vklyuchaetsya-posle-nazhatiya-na-uvedomlenie/40354676#40354676

У меня была та же проблема, и я решил ее, используя отражение и делая свое приложение системным подписанным приложением.

Вот код:

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

Это разрешение требует, чтобы приложение было подписано системой.

Другие вопросы по тегам