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" />
Это разрешение требует, чтобы приложение было подписано системой.