2012-10-24 23 views
12

Trong ứng dụng của tôi, tôi vô hiệu hóa khóa bàn phím (ví dụ: Khóa màn hình) bằng mã bên dưới và hoạt động tốt cho đến khi tôi nhấp vào bất kỳ thông báo nào trên thanh thông báo. Nếu tôi nhấp vào thông báo, màn hình khóa sẽ tự động được bật lại. Bất kỳ trợ giúp được đánh giá cao.Khóa bàn phím bị vô hiệu hóa tự kích hoạt lại sau khi nhấp vào thông báo

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

Trả lời

15

Tôi đã nhận thấy cùng một vấn đề trong một thời gian. Nó chỉ xảy ra trên Honeycomb (Android 3.0) trở lên. Sau rất nhiều thử nghiệm và kéo tóc, tôi dường như đã tìm ra một giải pháp phù hợp với tôi. Nó không rõ ràng chính xác những gì đang xảy ra hoặc tại sao, nhưng đây là những gì tôi đã tìm ra.

Dường như trên Android 3.0 trở lên, sau khi khóa phím tắt, khi thông báo được nhấn, KeyguardLock cũ hết hạn, nhưng may mắn là Broadcast ACTION_USER_PRESENT được kích hoạt tại thời điểm đó, vì vậy chúng tôi có cơ hội khắc phục sự cố.

Một điểm hoàn toàn không rõ ràng trong tài liệu là có vẻ như cần thiết để có thể bật lại KeyguardLock cũ trước khi nhận được khóa mới và tắt lại. Một "gotcha" khác mà tôi phát hiện ra là vô hiệu hóa thông qua KeyguardLock mới ngay lập tức sau khi kích hoạt lại thông qua cái cũ chỉ tạo ra thành công liên tục. Tôi đã giải quyết vấn đề này bằng cách đợi 300ms trước khi tắt.

Đây là phiên bản mã đơn giản của tôi; cần dễ dàng điều chỉnh ứng dụng của bạn:

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 từ tôi. đã lưu ngày của tôi - Tôi chỉ thực hiện sửa đổi nhỏ đối với mã ở trên (chuyển dòng postDelayed ngay sau khi chặn). –

+0

Tính năng này có hoạt động với điện thoại RedMI không? –

+0

@JalpeshKhakhi Tôi đã không thử nghiệm nó trên những người. Nó nên, nhưng nó có thể nó không, nếu Android đã được thay đổi đủ. –

Các vấn đề liên quan