मेरे एप्लिकेशन में, जो एक डिवाइस व्यवस्थापक है, जब उपयोगकर्ता एप्लिकेशन के व्यवस्थापक फ़ंक्शन को निष्क्रिय करने का प्रयास करता है तो मुझे पूरे डिवाइस को मिटा देना होगा। जब उपयोगकर्ता सेटिंग्स/सुरक्षा/डिवाइस व्यवस्थापक पर जाता है और व्यवस्थापक ऐप को निष्क्रिय करता है, तो पहले एक संवाद प्रस्तुत किया जाता है "क्या आप निष्क्रिय करना चाहते हैं"। यदि उपयोगकर्ता "हां" कहता है, तो एक और छोटा संवाद प्रस्तुत किया जाता है, जिसमें एप्लिकेशन के 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()। उस समय, व्यवस्थापक अभी भी सक्रिय है और यह काम करता है।
क्या यह सही है? जब उपयोगकर्ता व्यवस्थापक ऐप को अक्षम करना चुनता है तो डिवाइस को कैसे मिटाया जाए?
मुझे लगता है कि एक wipeData() कॉल करने की कोशिश कर रहा है DisableRequested() या ऑनडिसेबल() चीजों को एक धूर्त स्थिति में डालता है, और स्क्रीन बंद होने पर डेटा मिटा देता है। क्या आपके पास इसके साथ कोई और भाग्य है? –
स्क्रीन बंद होने पर डेटा कभी भी सफल हो सकता है? हमने इसका परीक्षण नहीं किया। (हमने डिवाइस को एंड्रॉइड 3.2 में बदल दिया है जहां हम ऑन-डिस्प्ले पर चीजें कर सकते हैं।) – winitzki
अगर मैं एक AsyncTask को DisableRequested() से शुरू करता हूं तो मैं इसे काम करने में सक्षम था। मुझे लगता है कि जब भी डिस्प्ले रिक्वेस्टेड() कहा जाता है, तो जो भी थ्रेड निष्पादित होता है, एक wipeData() कॉल विश्वसनीय रूप से यहां नहीं किया जा सकता है। जब मैंने इसे AsyncTask से निकाल दिया, तो मुझे लगता है कि PowerOff संवाद लगभग तुरंत आ गया है। –