ऐप्लिकेशन बनाते समय, यह ध्यान रखना ज़रूरी है कि आपके ऐप्लिकेशन को डिवाइस पर मौजूद किन अन्य ऐप्लिकेशन के साथ इंटरैक्ट करना है. अगर आपका ऐप्लिकेशन, Android 11 (एपीआई लेवल 30) या इसके बाद के वर्शन को टारगेट करता है, तो सिस्टम कुछ ऐप्लिकेशन को आपके ऐप्लिकेशन के लिए अपने-आप दिखने की अनुमति देता है. हालांकि, यह डिफ़ॉल्ट रूप से अन्य ऐप्लिकेशन को फ़िल्टर कर देता है. इस गाइड में बताया गया है कि उन दूसरे ऐप्लिकेशन को अपने ऐप्लिकेशन में कैसे दिखाया जाए.
अगर आपका ऐप्लिकेशन Android 11 या इसके बाद के वर्शन को टारगेट करता है और उसे उन ऐप्लिकेशन के साथ इंटरैक्ट करना है जो अपने-आप नहीं दिखते हैं, तो अपने ऐप्लिकेशन की मेनिफ़ेस्ट फ़ाइल में <queries>
एलिमेंट जोड़ें. <queries>
एलिमेंट में, अन्य ऐप्लिकेशन के बारे में जानकारी दें. इसके लिए, पैकेज का नाम, इंटेंट सिग्नेचर या प्रोवाइडर अथॉरिटी का इस्तेमाल करें. इसके बारे में यहां बताया गया है.
चुनिंदा पैकेज के नाम
अगर आपको उन ऐप्लिकेशन के बारे में पता है जिनसे आपको क्वेरी करनी है या जिनके साथ इंटरैक्ट करना है, जैसे कि आपके ऐप्लिकेशन के साथ इंटिग्रेट होने वाले ऐप्लिकेशन या वे ऐप्लिकेशन जिनकी सेवाओं का इस्तेमाल किया जाता है, तो उनके पैकेज के नाम, <queries>
एलिमेंट के अंदर मौजूद <package>
एलिमेंट के सेट में शामिल करें:
<manifest package="com.example.game"> <queries> <package android:name="com.example.store" /> <package android:name="com.example.services" /> </queries> ... </manifest>
किसी लाइब्रेरी में मौजूद होस्ट ऐप्लिकेशन से कम्यूनिकेट करना
अगर आपको कोई Android लाइब्रेरी बनानी है, तो AAR मेनिफ़ेस्ट फ़ाइल में <queries>
एलिमेंट जोड़कर, पैकेज की दृश्यता से जुड़ी अपनी ज़रूरतें बताई जा सकती हैं. इस <queries>
एलिमेंट में वही फ़ंक्शन मौजूद है जिसे ऐप्लिकेशन अपने मेनिफ़ेस्ट में शामिल कर सकते हैं.
अगर आपकी लाइब्रेरी, होस्ट ऐप्लिकेशन के साथ कम्यूनिकेट करती है, जैसे कि बाउंड
सर्विस का इस्तेमाल करना, तो <package>
एलिमेंट शामिल करें. यह एलिमेंट, होस्ट ऐप्लिकेशन के पैकेज का नाम तय करता है:
<!-- Place inside the <queries> element. --> <package android:name=PACKAGE_NAME />
इस एलान को शामिल करके, यह पता लगाया जा सकता है कि होस्ट ऐप्लिकेशन इंस्टॉल है या नहीं. साथ ही, इसके साथ इंटरैक्ट किया जा सकता है. जैसे, bindService()
को कॉल करके.
इस इंटरैक्शन के बाद, कॉल करने वाला ऐप्लिकेशन, होस्ट ऐप्लिकेशन को अपने-आप दिखने लगता है. यह ऐप्लिकेशन, आपकी लाइब्रेरी का इस्तेमाल करता है.
ऐसे पैकेज जो इंटेंट फ़िल्टर के सिग्नेचर से मेल खाते हैं
ऐसा हो सकता है कि आपके ऐप्लिकेशन को किसी खास मकसद को पूरा करने वाले ऐप्लिकेशन के सेट से क्वेरी करने या उसके साथ इंटरैक्ट करने की ज़रूरत हो. हालांकि, आपको शामिल किए जाने वाले ऐप्लिकेशन के पैकेज के नाम के बारे में पता न हो. ऐसी स्थिति में, अपने <queries>
एलिमेंट में इंटेंट फ़िल्टर के सिग्नेचर की सूची बनाई जा सकती है. इसके बाद, आपका ऐप्लिकेशन ऐसे ऐप्लिकेशन ढूंढ सकता है जिनमें <intent-filter>
से मिलते-जुलते एलिमेंट हों.
यहां दिए गए कोड के उदाहरण में, एक <intent>
एलिमेंट दिखाया गया है. इसकी मदद से, ऐप्लिकेशन को JPEG इमेज शेयर करने की सुविधा देने वाले अन्य इंस्टॉल किए गए ऐप्लिकेशन दिखेंगे:
<manifest package="com.example.game"> <queries> <intent> <action android:name="android.intent.action.SEND" /> <data android:mimeType="image/jpeg" /> </intent> </queries> ... </manifest>
<intent>
एलिमेंट के इस्तेमाल पर कुछ पाबंदियां हैं:
- आपको सिर्फ़ एक
<action>
एलिमेंट शामिल करना होगा. <data>
एलिमेंट मेंpath
,pathPrefix
,pathPattern
याport
एट्रिब्यूट का इस्तेमाल नहीं किया जा सकता. सिस्टम इस तरह काम करता है जैसे आपने हर एट्रिब्यूट की वैल्यू को सामान्य वाइल्डकार्ड वर्ण (*
) पर सेट किया हो.<data>
एलिमेंट केmimeGroup
एट्रिब्यूट का इस्तेमाल नहीं किया जा सकता.एक
<intent>
एलिमेंट के<data>
एलिमेंट में, इनमें से हर एट्रिब्यूट का इस्तेमाल ज़्यादा से ज़्यादा एक बार किया जा सकता है:mimeType
scheme
host
इन एट्रिब्यूट को कई
<data>
एलिमेंट में बांटा जा सकता है या इनका इस्तेमाल एक ही<data>
एलिमेंट में किया जा सकता है.
<intent>
एलिमेंट, कुछ एट्रिब्यूट की वैल्यू के तौर पर, सामान्य वाइल्डकार्ड वर्ण (*
) के साथ काम करता है:
<action>
एलिमेंट काname
एट्रिब्यूट.- यह
<data>
एलिमेंट (image/*
) केmimeType
एट्रिब्यूट का सबटाइप है. <data>
एलिमेंट (*/*
) केmimeType
एट्रिब्यूट का टाइप और सबटाइप.<data>
एलिमेंट काscheme
एट्रिब्यूट.<data>
एलिमेंट काhost
एट्रिब्यूट.
पिछली सूची में बताए गए मामलों के अलावा, सिस्टम टेक्स्ट और वाइल्डकार्ड वर्णों, जैसे कि prefix*
के कॉम्बिनेशन का इस्तेमाल नहीं कर सकता.
ऐसे पैकेज जो किसी खास अथॉरिटी का इस्तेमाल करते हैं
अगर आपको किसी कॉन्टेंट
प्रोवाइडर से क्वेरी करनी है, लेकिन आपको पैकेज के नाम नहीं पता हैं, तो <provider>
एलिमेंट में प्रोवाइडर अथॉरिटी का एलान किया जा सकता है. इसे यहां दिए गए स्निपेट में दिखाया गया है:
<manifest package="com.example.suite.enterprise"> <queries> <provider android:authorities="com.example.settings.files" /> </queries> ... </manifest>
एक ही <queries>
एलिमेंट में, सेवा देने वाली कंपनियों के अधिकार के बारे में बताया जा सकता है. <queries>
एलिमेंट में, एक या उससे ज़्यादा <provider>
एलिमेंट का एलान किया जा सकता है. A
<provider>
एलिमेंट में, सेवा देने वाली किसी एक कंपनी का अधिकार या सेवा देने वाली कंपनियों के अधिकारों की सेमीकोलन से अलग की गई सूची शामिल हो सकती है.
सभी ऐप्लिकेशन (इसका सुझाव नहीं दिया जाता)
कुछ मामलों में, आपके ऐप्लिकेशन को किसी डिवाइस पर इंस्टॉल किए गए सभी ऐप्लिकेशन से क्वेरी करने या उनके साथ इंटरैक्ट करने की ज़रूरत पड़ सकती है. भले ही, उनमें कोई भी कॉम्पोनेंट शामिल हो. आपके ऐप्लिकेशन को डिवाइस पर इंस्टॉल किए गए सभी ऐप्लिकेशन देखने की अनुमति देने के लिए, सिस्टम QUERY_ALL_PACKAGES
अनुमति देता है.
इस्तेमाल के कुछ ऐसे उदाहरण यहां दिए गए हैं जिनमें QUERY_ALL_PACKAGES
अनुमति को शामिल करना सही है:
- सुलभता ऐप्लिकेशन
- ब्राउज़र
- डिवाइस मैनेजमेंट ऐप्लिकेशन
- सुरक्षा से जुड़े ऐप्लिकेशन
- एंटी वायरस की सुविधा देने वाले ऐप्लिकेशन
हालांकि, आम तौर पर अपने-आप दिखने वाले ऐप्लिकेशन के सेट के साथ इंटरैक्ट करके, ऐप्लिकेशन के इस्तेमाल के उदाहरणों को पूरा किया जा सकता है. साथ ही, मेनिफ़ेस्ट फ़ाइल में उन ऐप्लिकेशन के बारे में बताया जा सकता है जिन्हें आपके ऐप्लिकेशन को ऐक्सेस करने की ज़रूरत है. उपयोगकर्ता की निजता का ध्यान रखते हुए, आपके ऐप्लिकेशन को पैकेज की उतनी ही जानकारी देखने की अनुमति मांगनी चाहिए जितनी उसके काम करने के लिए ज़रूरी है.
Google Play की इस नीति के अपडेट में, उन ऐप्लिकेशन के लिए दिशा-निर्देश दिए गए हैं जिन्हें QUERY_ALL_PACKAGES
की अनुमति चाहिए.