Отключенная блокировка клавиатуры снова включается после нажатия на уведомление.

В моем приложении я отключаю блокировку клавиатуры (т.е. Удалить экран блокировки), используя приведенный ниже код, и он работает нормально, пока я не нажму любое уведомление на панели уведомлений. Если я нажму на уведомление, экран блокировки автоматически снова включится. Любая помощь приветствуется.

private void remove_lockscreen() {
    final CheckBoxPreference lock = (CheckBoxPreference) findPreference("remove_lockscreen");
    KeyguardManager km = (KeyguardManager)getSystemService(KEYGUARD_SERVICE);
    KeyguardLock kl = km.newKeyguardLock("keyguard_lock");
    if (lock.isChecked()) {
        prefEdit("remove_lockscreen", 1);
        Toast.makeText(getBaseContext(), "Lockscreen will not be shown", Toast.LENGTH_SHORT).show();
        kl.disableKeyguard();
    }
    else if (!lock.isChecked()) {
        prefEdit("remove_lockscreen", 0);
        Toast.makeText(getBaseContext(), "Lockscreen will be shown", Toast.LENGTH_SHORT).show();
        kl.reenableKeyguard();
        android.os.Process.killProcess(android.os.Process.myPid());
    }
}

person Jasjit Singh Marwah    schedule 24.10.2012    source источник


Ответы (1)


Я заметил ту же проблему в течение некоторого времени. Это происходит только на 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
comment
+1 от меня. спас мой день - я просто немного изменил код выше (переместил строку postDelayed сразу после блока if). - person NeviQ-OR; 13.11.2014
comment
@JalpeshKhakhi Я не проверял это на них. Должен, но возможно и нет, если Android достаточно переделали. - person Darshan Rivka Whittle; 13.01.2017