2012-10-24 12 views
12

私のアプリケーションでは、以下のコードを使用してキーガードロック(すなわちロック解除画面)を無効にします。通知をクリックすると、ロック画面が自動的に再び有効になります。どんな助けもありがとうございます。無効KeyGuard Lockは通知をクリックすると再び有効になります

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

答えて

15

私はしばらくの間、同じ問題に気付きました。 Honeycomb(Android 3.0)以降でのみ発生します。実験やヘア抜きの大量の後、私のために働く解決策を見つけたようです。何が起きているのか、なぜそれが起こっているのかは明確ではありませんが、ここで私が理解したことがあります。

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

ドキュメントからはっきりと分かりませんが、新しいKeyGuardLockを入手してもう一度無効にする前に、古いKeyguardLockを再度有効にする必要があるようです。私が発見したもう一つの「つかみ」は、古い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); 
     } 
    } 
}; 
+0

+1私から。私の日を救った - 私はちょうど上記のコード(ブロックの場合は、直後のpostDelayed行移動)を少し変更しました。 –

+0

これはRedMI電話機でも使用できますか? –

+0

@JalpeshKhakhi私はそれらをテストしていません。それはすべきだが、Androidが十分に変更されていれば可能ではないかもしれない。 –

関連する問題