बताएं कि पैकेज किसको दिखे

ऐप्लिकेशन बनाते समय, यह ध्यान रखना ज़रूरी है कि डिवाइस पर मौजूद किन ऐप्लिकेशन के साथ आपके ऐप्लिकेशन को इंटरैक्ट करना है. अगर आपका ऐप्लिकेशन, 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 लाइब्रेरी बनाई है, तो एएआर मेनिफ़ेस्ट फ़ाइल में <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> एलिमेंट का एलान किया जा सकता है. <provider> एलिमेंट में, सेवा देने वाली एक ही कंपनी या सेवा देने वाली कंपनियों की सूची शामिल की जा सकती है. सूची में, सेमीकोलन लगाकर अलग-अलग कंपनियों के नाम लिखे जाते हैं.

सभी ऐप्लिकेशन (इसका सुझाव नहीं दिया जाता)

बहुत कम मामलों में, आपके ऐप्लिकेशन को किसी डिवाइस पर इंस्टॉल किए गए सभी ऐप्लिकेशन के लिए क्वेरी करनी पड़ सकती है या उनसे इंटरैक्ट करना पड़ सकता है. ऐप्लिकेशन में मौजूद कॉम्पोनेंट कुछ भी नहीं होते. आपके ऐप्लिकेशन को डिवाइस पर इंस्टॉल किए गए सभी अन्य ऐप्लिकेशन देखने की अनुमति देने के लिए, सिस्टम QUERY_ALL_PACKAGES अनुमति देता है.

इस्तेमाल के ऐसे उदाहरण जिनमें QUERY_ALL_PACKAGES अनुमति शामिल करना सही है:

  • सुलभता ऐप्लिकेशन
  • ब्राउज़र
  • डिवाइस मैनेजमेंट ऐप्लिकेशन
  • सुरक्षा से जुड़े ऐप्लिकेशन
  • एंटी वायरस की सुविधा देने वाले ऐप्लिकेशन

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

Google Play की नीति में हुए इस अपडेट में, उन ऐप्लिकेशन के लिए दिशा-निर्देश दिए गए हैं जिन्हें QUERY_ALL_PACKAGES अनुमति की ज़रूरत है.