2012-10-24 13 views
12

In meiner Anwendung deaktiviere ich die Keyguard-Sperre (d. Entfernen Lock Screen) mit dem folgenden Code und es funktioniert gut, bis ich auf eine Benachrichtigung in der Benachrichtigungsleiste klicken. Wenn ich auf eine Benachrichtigung klicke, wird der Sperrbildschirm automatisch wieder aktiviert. Jede Hilfe wird geschätzt.Disabled Keyguard Lock wieder aktiviert sich selbst nach dem Klicken auf eine Benachrichtigung

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

Antwort

15

Ich habe das gleiche Problem seit einiger Zeit bemerkt. Es tritt nur bei Honeycomb (Android 3.0) und höher auf. Nach viel Experimentieren und Haare ziehen scheint mir eine Lösung gefunden zu haben, die für mich funktioniert. Es ist nicht klar, was genau passiert oder warum, aber hier ist, was ich herausgefunden habe.

Es scheint, dass die alte KeyguardLock auf Android 3.0+, nach dem Deaktivieren der Tastensperre, wenn eine Benachrichtigung gedrückt wird, abläuft, aber zum Glück wird die ACTION_USER_PRESENT Broadcast an diesem Punkt ausgelöst, so haben wir eine Chance, das Problem zu beheben.

Ein Punkt, der aus der Dokumentation nicht offensichtlich ist, ist, dass es notwendig scheint, die alte KeyguardLock wieder zu aktivieren, bevor Sie eine neue KeyguardLock erhalten und sie wieder deaktivieren. Ein weiteres "Gotcha", das ich entdeckt habe, ist, dass die Deaktivierung durch das neue KeyguardLock unmittelbar nach der erneuten Aktivierung durch das alte nur zu zeitweiligen Erfolgen führt. Ich habe dies gelöst, indem ich 300ms gewartet habe, bevor ich es deaktiviere.

Hier ist eine etwas vereinfachte Version meines Codes; es sollte einfach sein, sich an deine app anzupassen:

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 von mir. Ich habe meinen Tag gerettet - ich habe nur eine kleine Änderung am obigen Code vorgenommen (verschobene postDelayed Zeile direkt nach if Block). –

+0

Funktioniert das mit RedMI-Telefonen? –

+0

@JalpeshKhakhi Ich habe es nicht auf diese getestet. Es sollte, aber es ist möglich, dass es nicht, wenn Android genug geändert wurde. –