2012-10-24 25 views
12

पर क्लिक करने के बाद स्वयं को फिर से सक्षम करता है मेरे आवेदन में मैं नीचे दिए गए कोड का उपयोग करके कीगार्ड लॉक (यानी लॉकस्क्रीन हटाएं) अक्षम करता हूं और जब तक मैं अधिसूचना बार में किसी भी अधिसूचना पर क्लिक नहीं करता तब तक यह ठीक काम करता है। अगर मैं अधिसूचना पर क्लिक करता हूं तो लॉक स्क्रीन स्वचालित रूप से पुनः सक्षम हो जाती है। किसी भी मदद की सराहना की है।अक्षम कुंजीगार्ड लॉक अधिसूचना

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

मैंने कुछ समय के लिए एक ही समस्या देखी है। यह केवल हनीकॉम (एंड्रॉइड 3.0) और ऊपर होता है। प्रैक्टिस और बालों को खींचने के बाद, मुझे लगता है कि मेरे लिए एक समाधान मिल गया है। यह स्पष्ट नहीं है कि क्या हो रहा है या क्यों, लेकिन यहां मैंने जो कुछ पता लगाया है।

ऐसा लगता है कि कुंजीपटल अक्षम होने के बाद एंड्रॉइड 3.0+ पर, जब कोई अधिसूचना दबाई जाती है, तो पुराने कीगार्ड लॉक की समयसीमा समाप्त हो जाती है, लेकिन शुक्रिया ACTION_USER_PRESENT प्रसारण उस बिंदु पर निकाल दिया जाता है, इसलिए हमारे पास इस मुद्दे को सही करने का मौका है।

एक बिंदु जो दस्तावेज़ीकरण से बिल्कुल स्पष्ट नहीं है, यह है कि एक नया प्राप्त करने से पहले पुराने कुंजीगार्ड लॉक को पुन: सक्षम करना और इसे फिर से अक्षम करना आवश्यक लगता है। मैंने पाया कि एक अन्य "गॉचाचा" यह है कि पुराने के माध्यम से पुनः सक्षम करने के तुरंत बाद नए कीगार्ड लॉक के माध्यम से अक्षम करने से केवल अंतःक्रियात्मक सफलता उत्पन्न होती है। मैंने इसे अक्षम करने से पहले 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 मुझसे +1। मेरे दिन को बचाया - मैंने अभी उपरोक्त कोड में मामूली संशोधन किया है (अगर ब्लॉक के बाद दायीं तरफ पोस्ट किया गया है)। –

+0

क्या यह रेडीएमआई फोन के साथ काम कर रहा है? –

+0

@ जल्पेशखखी मैंने उन पर परीक्षण नहीं किया है। यह चाहिए, लेकिन यह संभव है कि यह नहीं है, अगर एंड्रॉइड पर्याप्त बदल दिया गया है। –