2012-10-24 40 views
12

在我的應用程序中,我使用下面的代碼禁用了鍵鎖(即Remove 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()); 
    } 
} 

回答

15

我已經注意到一段時間以來的相同問題。它只發生在Honeycomb(Android 3.0)以上。經過大量的實驗和拔毛之後,我似乎找到了適合我的解決方案。目前尚不清楚究竟發生了什麼或爲什麼,但這是我已經想出的。

看起來,在Android 3.0+上,在鍵盤被禁用後,當按下通知時,舊的KeyguardLock過期,但幸好ACTION_USER_PRESENT廣播在那一刻被觸發,所以我們有機會糾正這個問題。

從文檔中看不出任何一點,似乎有必要在重新啓用舊的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 from me。保存了我的一天 - 我只是對上面的代碼做了小小的修改(在block之後立即移動postDelayed行)。 –

+0

這是否與RedMI手機一起工作? –

+0

@JalpeshKhakhi我還沒有測試過這些。它應該,但它可能不會,如果Android已經足夠改變。 –

相關問題