2010-01-25 21 views
6

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

मैंने क्या किया:

  • जोड़ें शॉर्टकट एप्लिकेशन पहले प्रक्षेपण पर या न्यूट डिवाइस पर रिबूट com.android.launcher.action.INSTALL_SHORTCUT का उपयोग कर होम स्क्रीन पर।
  • मैन्युअल रूप से com.android.launcher.action.UNINSTALL_SHORTCUT का उपयोग करके शॉर्टकट हटाएं।

क्या मैं नहीं है (और लगभग देने) कर सकते हैं:

  • स्वचालित रूप से शॉर्टकट को दूर जब आवेदन की स्थापना रद्द की जा रही है।

Intent.ACTION_PACKAGE_REMOVED का उपयोग करने का कोई तरीका नहीं है क्योंकि एप्लिकेशन को अनइंस्टॉल किया जा रहा है, इस उद्देश्य को प्राप्त नहीं होता है। मैंने कुछ परीक्षण किए और पाया कि एप्लिकेशन के साथ हटाए जा रहे एकमात्र शॉर्टकट प्रकार को शॉर्टकट है जो मेनू से बनाया गया है 'होम स्क्रीन में जोड़ें => शॉर्टकट्स => एप्लिकेशन => एप्लिकेशन गतिविधि'। शॉर्टकट जिन्हें प्रोग्रामेटिक रूप से बनाया जा रहा है या ऐप को अनइंस्टॉल करने के बाद एंड्रॉइडमैनिफेस्ट में घोषित किया गया है, होम स्क्रीन पर रहते हैं।

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

क्या एप्लिकेशन को अनइंस्टॉल करने पर संबंधित शॉर्टकट को हटाने के लिए ओएस से पूछने का कोई तरीका है? क्या मैं इस घटना को पकड़ सकता हूं कि इसे हटाए जाने से पहले एप्लिकेशन को अनइंस्टॉल किया जा रहा है?

उत्तर

2

मुझे विश्वास नहीं है कि आप यह कर सकते हैं।

सबसे पहले क्योंकि आप डिवाइस फर्मवेयर — पर पूर्व-स्थापित अनुप्रयोगों को अनइंस्टॉल नहीं कर सकते हैं, वे /system विभाजन पर मौजूद हैं जो केवल-पढ़ने वाली फाइल सिस्टम है।

दूसरा, जैसा कि आप नोट करते हैं, आपका आवेदन receives no notification that it is being uninstalled

यदि उपयोगकर्ता आपके एप्लिकेशन का उपयोग नहीं करना चाहते हैं, तो क्या वे केवल एप्लिकेशन आइकन को अनदेखा नहीं करेंगे, जैसा कि मैं अपने फोन पर कुछ पूर्व-स्थापित ऐप्स के लिए करता हूं?


संपादित करें:
आप को पहले से इंस्टॉल किए गए एप्लिकेशन (लेकिन commonsware.com नोटों के रूप में फर्मवेयर पर नहीं) के लिए जा रहे हैं, तो आप दो APK द्वारा पहले से इंस्टॉल करने सकता है। जिनमें से कोई भी लॉन्चर नहीं है और इसमें केवल एक प्रसारण रिसीवर होता है जो ACTION_PACKAGE_REMOVED ईवेंट को संभालता है और UNINSTALL_SHORTCUT पर कॉल करता है।

मुझे विश्वास नहीं है कि कोई स्पष्ट अनुमति जांच है जिसके लिए एक ही ऐप द्वारा निकाले जाने वाले शॉर्टकट की आवश्यकता होती है, लेकिन आप एपीके दोनों के लिए sharedUserId का उपयोग कर इसे प्राप्त कर सकते हैं।

+0

ध्यान दें कि "पूर्व-स्थापित" जरूरी नहीं है कि "फर्मवेयर"। एक आवेदन स्थापित करना संभव है जैसे कि यह एक सामान्य अनुप्रयोग था, लेकिन डिवाइस पर पहले से ही शिप करने के लिए ऐसा होता है। ARCHOS 5 एंड्रॉइड टैबलेट ने उदाहरण के लिए एक दर्जन या उससे अधिक ऐप्स के साथ किया था। वास्तव में – CommonsWare

+0

। मैं उन उपकरणों के साथ काम कर रहा हूं जो * फर्मवेयर पर ऐप्स इंस्टॉल किए जाएंगे, इसलिए मैंने फर्मवेयर भाग का उल्लेख करना सुनिश्चित किया। लेकिन मुझे लगता है कि PACKAGE_REMOVED प्रसारण की कमी के कारण भी समस्या खड़ी रहेगी। –

+0

हालांकि आपकी टिप्पणी ने मुझे गैर-फर्मवेयर प्री-इंस्टॉलेशन के लिए संभावित समाधान जोड़ने के लिए प्रेरित किया। :) –

1

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

+0

बहुत अच्छा लगता है। नया लॉन्चर किस संस्करण में शामिल होगा? –

2

ऐसा लगता है कि आप install_shortcut इरादे को सही तरीके से उपयोग नहीं करते हैं। शायद आप किसी भी पैरामीटर के बिना एक इरादा बनाते हैं। आपको एक कार्रवाई Intent.ACTION_MAIN परम के साथ इरादा बनाना चाहिए।

Intent shortcutIntent = new Intent(Intent.ACTION_MAIN); 
shortcutIntent.setClassName(this, this.getClass().getName()); 

Intent intent = new Intent("com.android.launcher.action.INSTALL_SHORTCUT"); 
intent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent); 
intent.putExtra(Intent.EXTRA_SHORTCUT_NAME, getString(R.string.app_name)); 
Parcelable iconResource = Intent.ShortcutIconResource.fromContext(
      this, R.drawable.launcher_icon); 
intent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, iconResource); 
sendBroadcast(intent);