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

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

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

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

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

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

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

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