2012-10-24 2 views
12

내 애플리케이션에서 아래 코드를 사용하여 키 가드 잠금 (즉, 잠금 잠금 화면)을 사용 중지하고 알림 바에서 알림을 클릭 할 때까지 제대로 작동합니다. 알림을 클릭하면 잠금 화면이 자동으로 다시 사용 설정됩니다. 어떤 도움을 주셔서 감사합니다.사용 안함 알림을 클릭하면 Keyguard 잠금이 다시 활성화됩니다.

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을 통해 비활성화하는 것이 간헐적 인 성공 만 발생한다는 것입니다. 나는 이것을 해제하기 전에 300ms를 기다려서 이것을 해결했다.

다음은 약간 단순화 된 코드입니다. 앱에 쉽게 적응해야합니다.

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 나는 그것들을 테스트하지 않았다. 안드로이드가 충분히 바뀌었다면 가능하다. –