2011-11-23 4 views
6

मैं एक ऐसे एप्लिकेशन को विकसित कर रहा हूं, जब भी कोई उपयोगकर्ता ऐप छोड़ देता है और वापस आ जाता है (स्क्रीन लॉक के माध्यम से हो या वापस स्क्रीन के माध्यम से होम स्क्रीन पर जा रहा हो या होम बटन)। मैं इसे का उपयोग कर काम कर निम्नलिखित था:पता करें कि पासकोड लॉक कब दिखाना है

प्रारंभिक गतिविधि स्टार्टअप पर पासकोड जांच करने के लिए कहेंगे, और प्रत्येक गतिविधि उनके onPause विधि के लिए निम्न कार्यक्षमता कहा:

@Override 
public void onPause() { 
    super.onPause(); 

    if (!isFinishing()) { 
    new PasscodeCheckTask(this.getApplicationContext(),this).execute(); 
    } 
} 

PassocdeCheckTask निम्नलिखित की तरह दिखता है। यह अगर स्क्रीन के बंद होने या एप्लिकेशन पृष्ठभूमि

public class PasscodeCheckTask extends AsyncTask<Void, Void, Boolean> { 

    public static final int CHECK_PASSCODE = 0; 

    private Context mActivityApplicationContext; 
    private Context mActivityContext; 

    public PasscodeCheckTask(Context applicationContext, Context activityContext){ 
     mActivityApplicationContext = applicationContext; 
     mActivityContext = activityContext; 
    } 

    @Override 
    protected Boolean doInBackground(Void... params) { 
     Boolean result = false; 

     if (!((PowerManager)mActivityApplicationContext.getSystemService(android.content.Context.POWER_SERVICE)).isScreenOn() || 
      !isAppOnForeground(mActivityApplicationContext)) { 
      result = true; 
     } 
     return result; 
    } 

    @Override 
    protected void onPostExecute(Boolean result) { 
     if (result) { 
      // Start passcode activity to check for passcode 
      /* CODE HERE */ 
      ((Activity)mActivityContext).startActivityForResult(intent, CHECK_PASSCODE); 
     } 
    } 

    protected boolean isAppOnForeground(final Context context) { 
     List<RunningAppProcessInfo> appProcesses = ((ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE)).getRunningAppProcesses(); 

     if (appProcesses == null) { 
      return false; 
     } 

     final String packageName = context.getPackageName(); 
     for (RunningAppProcessInfo appProcess : appProcesses) { 
      if ((appProcess.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND) && 
       appProcess.processName.equals(packageName)) { 
       return true; 
      } 
     } 
     return false; 
    } 
} 

जब किया पासकोड गतिविधि को ख़त्म कर में नहीं रह गया है, और बुला गतिविधि moveTaskToBackground (सही) पासकोड में सफल नहीं हुआ है, तो देखने के लिए जाँच करता है। जब तक मैंने इसे एचटीसी ईवो पर एमआईसीजी रोम के साथ करने की कोशिश नहीं की, तब तक यह प्रणाली खूबसूरती से काम करती रही। किसी कारण से, appProcess.importance IMPORTANCE_FOREGROUND के रूप में कभी नहीं दिखाया गया। यह हमेशा IMPORTANCE_BACKGROUND था। इस प्रकार, पासकोड हमेशा लाया जाएगा, भले ही ऐप पृष्ठभूमि में कभी नहीं चला।

मैंने उस फोन पर ड्रॉपबॉक्स को आजमाया (जिसमें पासकोड लॉक भी है), और यह खूबसूरती से काम करता है। जब पृष्ठभूमि में कोई ऐप चला गया है, या पृष्ठभूमि से वापस लाया जा रहा है, तो मुझे यह जानने का एक अलग तरीका नहीं दिख रहा है। इस काम को कैसे बनाया जाए इस पर कोई विचार?

+1

आप वास्तव में कुछ इस तरह करने की जरूरत नहीं होनी चाहिए। यदि आपका उपयोगकर्ता आपके ऐप का उपयोग करते समय अपने फोन को लॉक करता है तो क्या होगा? फिर उन्हें अपनी लॉकस्क्रीन, और फिर अपनी लॉकस्क्रीन करना होगा। मैं इसके लिए दंडित हो सकता हूं, लेकिन एंड्रॉइड लॉक स्क्रीन पर्याप्त है। यदि आप कुछ इतना महत्वपूर्ण कर रहे हैं कि आपको अपनी लॉक स्क्रीन की आवश्यकता है, तो शायद आपको इसे फोन पर भी पुनर्विचार करना चाहिए। –

+0

यह आवश्यक है और उपयोगकर्ता की निजी जानकारी से संबंधित है। मैं चिंता को समझता हूं, लेकिन इसके लिए एक पासकोड उपयोगी है। – Chewie

+0

यह एक अजीब टिप्पणी @ KurtisNusbaum की तरह है। मैं अपने फोन पर ड्रॉपबॉक्स का उपयोग करता हूं, और मेरे पास बहुत संवेदनशील संवेदनशील जानकारी संग्रहीत है। जैसा कि मुझे लगता है कि अधिकांश ड्रॉपबॉक्स खाते हैं। जब आप कहते हैं कि ऐसे ऐप्स को पासवर्ड से सुरक्षित रखना अच्छा नहीं है तो आप वास्तव में गंभीर नहीं हो सकते हैं। ऐसे कई मामले हैं जब पासवर्ड एक बहुत ही बुद्धिमान विचार है, यदि अनिवार्य नहीं है, तो कोई भी बहस कर सकता है। मुझे लगता है कि गैलरी ऐप में पासवर्ड होना चाहिए, मैं अपनी गोपनीयता पर बहुत उत्सुक हूं, और लोग एक दूसरे के फोन के साथ खेलना चाहते हैं। – slinden77

उत्तर

4

प्रत्येक गतिविधि के onStop() में, गतिविधि के समय के साथ एक स्थिर डेटा सदस्य अपडेट करें। प्रत्येक गतिविधि के onStart() में, उस समय की जांच करें, और यदि यह कुछ टाइमआउट थ्रेसहोल्ड से अधिक है, तो अपनी प्रमाणीकरण गतिविधि प्रदर्शित करें। उपयोगकर्ता को टाइमआउट मान सेट करने दें, ताकि अगर वे हर कुछ सेकंड में परेशान नहीं होना चाहते हैं, तो वे इसे नियंत्रित कर सकते हैं।

+0

हम्म, मैं देखता हूं कि यह काम करता है या नहीं। मुझे लगता है कि स्थिर चर अनुप्रयोग-व्यापी है? – Chewie

+0

@Chewie: "मुझे लगता है कि स्थिर चर अनुप्रयोग-व्यापी है?" - तकनीकी रूप से यह प्रक्रिया-व्यापी है, लेकिन आम तौर पर एक ही चीज़ के बराबर होती है। – CommonsWare

+0

गोटा, जो समझ में आता है – Chewie

1

मुझे समय-समय पर दृष्टिकोण पसंद आया, मैं इसे एक अच्छे तरीके से काम करने के लिए कुछ समय से संघर्ष कर रहा हूं। समय आधारित दृष्टिकोण अच्छी तरह से काम करता है। मैंने आसान उपयोग के लिए एक कक्षा बनाई है।

public class PinCodeCheck { 

    private static long INIT_TIME   = 0; 
    private static PinCodeCheck ref   = null; 
    private static SharedPreferences values = null; 

    private PinCodeCheck(Context context){ 
     values = context.getSharedPreferences("com.example.xxx", 0); //use your preferences file name key! 
    }//end constructor 

    public static synchronized PinCodeCheck getInstance(Context context) { 
     if (ref == null){ 
      ref = new PinCodeCheck(context); 
     } 
     return ref; 
    }//end method 

    public void init(){ 
     PinCodeCheck.INIT_TIME = System.currentTimeMillis();  
    }//end method 

    public void forceLock(){ 
     PinCodeCheck.INIT_TIME = 0;  
    }//end method 

    public boolean isLocked(){ 
     long currentTime = System.currentTimeMillis(); 
     long threshold  = values.getLong(Keys.PASSWORD_PROTECT_TIMEOUT, 30000); // check here, might change in between calls 
     if (currentTime - PinCodeCheck.INIT_TIME > threshold){ 
      return true; 
     } 
     return false;  
    }//end method 
}//end class 

उपयोग

private static PinCodeCheck check = PinCodeCheck.getInstance(context); 

@Override 
public void onResume() { 
    super.onResume(); 

    if (check.isLocked()) { 
     showDialog();    
    } 
}//end method 

@Override 
public void onPause() {   
    super.onPause(); 

    check.init(); 
}//end method 
+0

हाय, मैं अपने ऐप में से एक के लिए अपना दृष्टिकोण आज़मा रहा हूं। लेकिन मुझे इस लाइन में त्रुटि मिल रही है। मान = Preferences.init (संदर्भ); जैसा कि "विधि init (संदर्भ) प्रकार प्राथमिकता के लिए अपरिभाषित है" – dhiku

+0

आह हाँ, यह मेरे कस्टम 'साझाकरण' वर्ग के लिए एक पुनर्मिलन है। मैं उदाहरण संपादित करूंगा ... – slinden77

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^