2012-10-24 34 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已经足够改变。 –

相关问题