2012-02-15 17 views
11

मेरे एप्लिकेशन में, जो एक डिवाइस व्यवस्थापक है, जब उपयोगकर्ता एप्लिकेशन के व्यवस्थापक फ़ंक्शन को निष्क्रिय करने का प्रयास करता है तो मुझे पूरे डिवाइस को मिटा देना होगा। जब उपयोगकर्ता सेटिंग्स/सुरक्षा/डिवाइस व्यवस्थापक पर जाता है और व्यवस्थापक ऐप को निष्क्रिय करता है, तो पहले एक संवाद प्रस्तुत किया जाता है "क्या आप निष्क्रिय करना चाहते हैं"। यदि उपयोगकर्ता "हां" कहता है, तो एक और छोटा संवाद प्रस्तुत किया जाता है, जिसमें एप्लिकेशन के AdminReceiver द्वारा प्रदान किए गए पाठ को DisableRequested() में दिया जाता है। यदि उपयोगकर्ता तब "हाँ" कहता है, तो मैं पूरे डिवाइस को मिटा देना चाहता हूं। इसे कैसे पूरा करें?डिवाइस व्यवस्थापक निष्क्रिय होने पर एंड्रॉइड डिवाइस को कैसे मिटाया जाए?

मैंने सब कुछ करने की कोशिश की, उत्तर के लिए लंबे समय तक खोज की, कोई वास्तविक समाधान नहीं मिला।

मैं क्या करने की कोशिश की:

  • AdminReceiver एक समारोह onDisable है()। मैंने उस फ़ंक्शन में डिवाइस को वाइप करने का प्रयास किया। हालांकि, ऐसा लगता है कि ऑनसाइट() को के बाद व्यवस्थापक अक्षम कर दिया गया है। इस प्रकार ऐप wipeData() फ़ंक्शन का उपयोग नहीं कर सकता है (एक सुरक्षा अपवाद फेंक दिया गया है)। मैंने यह भी सत्यापित किया है कि उस समयAdminActive() झूठी वापसी करता है।

आधिकारिक दस्तावेज़ीकरण यह स्पष्ट रूप से नहीं कहता है, लेकिन ऐसा लगता है कि जब अक्षम() को कॉल किया जाता है तो व्यवस्थापक पहले ही अक्षम हो जाता है। इस प्रकार हमें उस समय डिवाइस को मिटा देना होगा।

  • AdminReceiver पर एक कार्य है DisableRequested(), जो CharSequence देता है। मैंने उस समारोह में एक और चेतावनी बॉक्स डालने की कोशिश की। यह दुर्घटनाग्रस्त हो जाता है क्योंकि एक चेतावनी बॉक्स को गैर-गतिविधि संदर्भ से नहीं कहा जा सकता है, जो कि हमारे पास तब होता है जब हम DisableRequested() पर होते हैं।

  • AdminReceiver पर एक समारोह है(), जिसे किसी भी घटना पर बुलाया जाता है। इस समारोह में, फिर से, हम एक गतिविधि संदर्भ में नहीं हैं और हमारे अपने संवाद प्रस्तुत नहीं कर सकते हैं।

  • मैंने ऑनसेसिव() से एक और गतिविधि बनाने की कोशिश की। यह काम; ऑनसेसिव() के दौरान जब हमें ACTION_DISABLE_ADMIN_REQUESTED मिलता है, तो व्यवस्थापक अभी भी सक्रिय है और हम डिवाइस को मिटा सकते हैं। हालांकि, सिस्टम अभी भी अपने संवाद को प्रस्तुत करता है कि उपयोगकर्ता को व्यवस्थापक को निष्क्रिय करना है या नहीं। यदि उपयोगकर्ता हमारे संवाद के लिए नहीं कहता है, लेकिन सिस्टम संवाद में हाँ, व्यवस्थापक निष्क्रिय हो जाएगा और हम डिवाइस को वाइप करने में विफल रहेगा।

मैं निम्नलिखित की कोशिश की, DeviceAdminReceiver की मेरी उपवर्ग में:

@Override 
public void onReceive(Context context, Intent intent) { 
// detect whether disabling is requested? 
if (intent.getAction().equals(ACTION_DEVICE_ADMIN_DISABLE_REQUESTED)) { 
      confirmWipeDevice(context); 

} else { 
    super.onReceive(context, intent); 
}  
} 

दूसरे शब्दों में, मैं फोन नहीं है super.onReceive() करता है, तो कार्रवाई व्यवस्थापक निष्क्रिय करने के लिए है। फ़ंक्शन पुष्टिकरण WipeDevice() एक संवाद के साथ एक अलग गतिविधि दिखाता है। यह मेरे व्यवस्थापक ऐप को अक्षम करने की पुष्टि करने के लिए सिस्टम संवाद नहीं दिखाता है। हालांकि, यह ऐप को वास्तव में अक्षम होने से नहीं रोकता है!

ऐसा लगता है कि एंड्रॉयड प्रणाली निम्नलिखित है:

  • संदेश AdminReceiver

  • व्यवस्थापक ऐप्स क्या करना चाहता है की परवाह किए बिना व्यवस्थापक को अक्षम करने के साथ आगे बढ़ें करने के लिए ACTION_DEVICE_ADMIN_DISABLE_REQUESTED

  • यदि उपयोगकर्ता अक्षम करने को रद्द करता है, ठीक है; यदि नहीं, तो ऐप अक्षम है। ऐप को अक्षम होने से इंकार करने का कोई तरीका नहीं है, या डिवाइस को अक्षम करने पर डिवाइस को निष्पादित करने का कोई तरीका नहीं है।

अब तक एकमात्र समाधान बिना पुष्टि के तुरंत मिटा देना है जब उपयोगकर्ता व्यवस्थापक ऐप को अक्षम करना चाहता है। दूसरे शब्दों में, मैं getManager() wipeData() को तुरंत अक्षम कर सकता हूं DisableRequested()। उस समय, व्यवस्थापक अभी भी सक्रिय है और यह काम करता है।

क्या यह सही है? जब उपयोगकर्ता व्यवस्थापक ऐप को अक्षम करना चुनता है तो डिवाइस को कैसे मिटाया जाए?

+0

मुझे लगता है कि एक wipeData() कॉल करने की कोशिश कर रहा है DisableRequested() या ऑनडिसेबल() चीजों को एक धूर्त स्थिति में डालता है, और स्क्रीन बंद होने पर डेटा मिटा देता है। क्या आपके पास इसके साथ कोई और भाग्य है? –

+0

स्क्रीन बंद होने पर डेटा कभी भी सफल हो सकता है? हमने इसका परीक्षण नहीं किया। (हमने डिवाइस को एंड्रॉइड 3.2 में बदल दिया है जहां हम ऑन-डिस्प्ले पर चीजें कर सकते हैं।) – winitzki

+0

अगर मैं एक AsyncTask को DisableRequested() से शुरू करता हूं तो मैं इसे काम करने में सक्षम था। मुझे लगता है कि जब भी डिस्प्ले रिक्वेस्टेड() कहा जाता है, तो जो भी थ्रेड निष्पादित होता है, एक wipeData() कॉल विश्वसनीय रूप से यहां नहीं किया जा सकता है। जब मैंने इसे AsyncTask से निकाल दिया, तो मुझे लगता है कि PowerOff संवाद लगभग तुरंत आ गया है। –

उत्तर

4

एंड्रॉइड 3.2 में उन्होंने इस समस्या को ठीक कर दिया है। एंड्रॉइड 3.1 में समस्या अभी भी मौजूद थी।

onDisabled में अब (एंड्रॉइड 3.2) में अभी भी व्यवस्थापक विशेषाधिकार हैं और इसलिए आप डिवाइस को मिटा सकते हैं।

+0

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

3

मेरी सिफारिश: ऐसा न करें जब तक यह कॉर्पोरेट-प्रकार की चीज़ की तरह न हो।

लेकिन। onDisableRequested() में, आप startActivity होम स्क्रीन के लिए startActivityActivity के लिए बना सकते हैं जो आपने बनाए है कि यह पुष्टि करता है कि वे जारी रखना चाहते हैं या नहीं। यदि वे हां चुनते हैं, तो आप वैसे ही करते हैं जब आप चाहें (डिवाइस को मिटाएं), अगर वे कहते हैं, तो होम स्क्रीन के लिए फिर से startActivity (या finish())।

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

पोंछने के बजाय, आप हमेशा resetPassword("new password") और lockNow() कर सकते हैं। यदि यह एक सुरक्षा से संबंधित ऐप है, तो व्यक्ति के डिवाइस को मिटाया नहीं जाना चाहिए, और ऐप इंस्टॉल करने वाले व्यक्ति द्वारा पासवर्ड पूर्व-परिभाषित किया गया होगा।

यदि आपके कोई अन्य प्रश्न हैं तो मुझे बताएं। आशा है कि ये आपकी मदद करेगा।

संपादित करें: मुझे एक अपवित्र मिला जो मुझे याद दिलाता है कि यह उत्तर मौजूद है, इसलिए मुझे लगा कि मैं कुछ जानकारी जोड़ूंगा।

आप lockNow() का उपयोग ऐसी गतिविधि के साथ कर सकते हैं जो लॉक स्क्रीन के शीर्ष पर दिखाएगा यदि आप लॉक करना चाहते हैं तो फिर भी वाइप या अन्य चीज़ों की पेशकश करें।
और वाइप शुरू करने से पहले लॉक करना किसी भी कारण से त्रुटि या देरी होने पर समस्याओं को रोकने के लिए एक अच्छा विचार होगा।

और यदि वितरित ऐप (ऐप स्टोर्स के माध्यम से) पर ऐसा कुछ भी कर रहे हैं, तो ध्यान रखें कि उनकी नीतियों का उल्लंघन न करें क्योंकि नीति उल्लंघन से ऐप स्टोर से स्थायी प्रतिबंध हो सकता है (यह Google Play पर मेरे साथ हुआ एक गलतफहमी से ज्यादा कुछ नहीं।)

+0

- यह एक "कॉरपोरेट जैसी चीज" है :) डिवाइस को वाइप करने के लिए ऐप की आवश्यकता है। - मैंने पहले से ही एक नई गतिविधि शुरू करने की कोशिश की है; लेकिन उपयोगकर्ता हमेशा "बैक" दबा सकते हैं और इससे छुटकारा पा सकते हैं, और फिर कुछ भी किए बिना व्यवस्थापक को अक्षम कर सकते हैं। - अगर मैं पासवर्ड रीसेट करना चाहता हूं और लॉक करना चाहता हूं, तो मुझे एक सक्रिय व्यवस्थापक होना चाहिए, इसलिए मैं पुष्टि * संवाद के बाद * यह * नहीं कर सकता। – winitzki

+0

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

+0

जब मैंने लॉकनॉ का उपयोग करने का सुझाव दिया, तो मेरा मतलब था कि संवाद को आंशिक समाधान के रूप में दिखाए जाने से पहले यदि आप बिना पुष्टि के मिटा देना चाहते हैं - तो आप इसके बजाए लॉक करेंगे, फिर पर्यवेक्षकों या जो भी पासवार्स होंगे। यदि आप हालिया ऐप्स (लंबे समय तक प्रेस घर) को साफ़ करने का कोई तरीका ढूंढ सकते हैं, तो आप घर की गतिविधि शुरू कर सकते हैं और आप सेट हो जाएंगे, लेकिन मुझे विश्वास नहीं है कि हालिया ऐप्स को साफ़ करने का कोई वैध तरीका है। – Jakar