Я заметил ту же проблему в течение некоторого времени. Это происходит только на Honeycomb (Android 3.0) и выше. После долгих экспериментов и выдергивания волос я, кажется, нашел решение, которое работает для меня. Не совсем понятно, что происходит и почему, но вот что я выяснил.
Кажется, что в Android 3.0+ после отключения блокировки клавиатуры при нажатии уведомления срок действия старого KeyguardLock истекает, но, к счастью, в этот момент запускается ACTION_USER_PRESENT
Broadcast, поэтому у нас есть шанс исправить проблему.
Один момент, который совсем не очевиден из документации, заключается в том, что, по-видимому, необходимо повторно включить старый KeyguardLock, прежде чем получить новый и снова отключить его. Еще одна ошибка, которую я обнаружил, заключается в том, что отключение с помощью нового KeyguardLock сразу после повторного включения с помощью старого дает лишь периодический успех. Я решил это, подождав 300 мс перед отключением.
Вот немного упрощенная версия моего кода; должно быть легко адаптироваться к вашему приложению:
private KeyguardLock kl;
private KeyguardManager km;
private final Handler mHandler = new Handler();
private final Runnable runDisableKeyguard = new Runnable() {
public void run() {
kl = km.newKeyguardLock(getPackageName());
kl.disableKeyguard();
}
};
private void setEnablednessOfKeyguard(boolean enabled) {
if (enabled) {
if (kl != null) {
unregisterReceiver(mUserPresentReceiver);
mHandler.removeCallbacks(runDisableKeyguard);
kl.reenableKeyguard();
kl = null;
}
} else {
if (km.inKeyguardRestrictedInputMode()) {
registerReceiver(mUserPresentReceiver, userPresent);
} else {
if (kl != null)
kl.reenableKeyguard();
else
registerReceiver(mUserPresentReceiver, userPresent);
mHandler.postDelayed(runDisableKeyguard, 300);
}
}
}
private final BroadcastReceiver mUserPresentReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (Intent.ACTION_USER_PRESENT.equals(intent.getAction())){
if (sp_store.getBoolean(KEY_DISABLE_LOCKING, false))
setEnablednessOfKeyguard(false);
}
}
};
person
Darshan Rivka Whittle
schedule
25.01.2013