12

私のアプリケーションでは、以下のコードを使用してキーガード ロック (ieRemove Lockscreen) を無効にすると、通知バーの通知をクリックするまで問題なく動作します。通知をクリックすると、ロック画面が自動的に再度有効になります。どんな助けでも大歓迎です。

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());
    }
}
4

1 に答える 1

15

しばらくの間、同じ問題に気づきました。Honeycomb (Android 3.0) 以降でのみ発生します。たくさんの実験と髪の毛を引っ張った後、私は自分に合った解決策を見つけたようです. 何が起こっているのか、その理由ははっきりしていませんが、私が理解したことは次のとおりです。

Android 3.0 以降では、キーガードが無効になった後、通知が押されると、古い KeyguardLock が期限切れになるようですが、ありがたいことACTION_USER_PRESENTにその時点でブロードキャストが起動されるため、問題を修正する機会があります。

ドキュメントからはまったく明らかでない点の 1 つは、新しい KeyguardLock を取得して再度無効にする前に、古い KeyguardLock を再度有効にする必要があるように思われることです。私が発見したもう 1 つの「落とし穴」は、古い 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);
        }
    }
};
于 2013-01-25T10:26:58.793 に答える