पैकेज को सीमित तौर पर दिखाए जाने की वजह से, इस्तेमाल के सामान्य उदाहरण पूरे किए जा सकते हैं

इस दस्तावेज़ में, इस्तेमाल के कुछ सामान्य उदाहरण दिए गए हैं. इनमें बताया गया है कि कोई ऐप्लिकेशन, दूसरे ऐप्लिकेशन के साथ कैसे इंटरैक्ट करता है. हर सेक्शन में, पैकेज की सीमित जानकारी के साथ ऐप्लिकेशन की सुविधाओं को पूरा करने के तरीके के बारे में दिशा-निर्देश दिए गए हैं. अगर आपका ऐप्लिकेशन Android 11 (एपीआई लेवल 30) या इसके बाद के वर्शन को टारगेट करता है, तो आपको इन दिशा-निर्देशों को ध्यान में रखना होगा.

जब Android 11 या इसके बाद के वर्शन को टारगेट करने वाला कोई ऐप्लिकेशन, किसी दूसरे ऐप्लिकेशन में गतिविधि शुरू करने के लिए इंटेंट का इस्तेमाल करता है, तो सबसे आसान तरीका यह है कि इंटेंट को शुरू किया जाए और अगर कोई ऐप्लिकेशन उपलब्ध नहीं है, तो ActivityNotFoundException अपवाद को हैंडल किया जाए.

अगर आपके ऐप्लिकेशन का कोई हिस्सा, startActivity() को कॉल करने की सुविधा पर निर्भर करता है, तो अपने ऐप्लिकेशन के मेनिफ़ेस्ट के <queries> एलिमेंट में कोई एलिमेंट जोड़ें. जैसे, यूज़र इंटरफ़ेस (यूआई) दिखाना. आम तौर पर, यह एक <intent> एलिमेंट होता है.

यूआरएल खोलें

इस सेक्शन में, Android 11 या उसके बाद के वर्शन को टारगेट करने वाले ऐप्लिकेशन में यूआरएल खोलने के अलग-अलग तरीकों के बारे में बताया गया है.

किसी ब्राउज़र या अन्य ऐप्लिकेशन में यूआरएल खोलना

किसी यूआरएल को खोलने के लिए, ऐसा इंटेंट इस्तेमाल करें जिसमें ACTION_VIEW इंटेंट ऐक्शन शामिल हो. इसके बारे में, वेब यूआरएल लोड करने से जुड़ी गाइड में बताया गया है. इस इंटेंट का इस्तेमाल करके startActivity() को कॉल करने के बाद, इनमें से कोई एक काम होता है:

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

    हमारा सुझाव है कि अगर आपके ऐप्लिकेशन में ActivityNotFoundException की गड़बड़ी होती है, तो उसे ठीक किया जाए.

startActivity() तरीके से किसी दूसरे ऐप्लिकेशन की गतिविधि शुरू करने के लिए, पैकेज दिखाने की अनुमति की ज़रूरत नहीं होती. इसलिए, आपको अपने ऐप्लिकेशन के मेनिफ़ेस्ट में <queries> एलिमेंट जोड़ने या मौजूदा <queries> एलिमेंट में कोई बदलाव करने की ज़रूरत नहीं है. यह यूआरएल खोलने वाले इंप्लिसिट और एक्सप्लिसिट, दोनों तरह के इंटेंट के लिए सही है.

यह कुकी, यह पता लगाती है कि ब्राउज़र उपलब्ध है या नहीं

कुछ मामलों में, यूआरएल खोलने की कोशिश करने से पहले, आपका ऐप्लिकेशन यह पुष्टि करना चाहता है कि डिवाइस पर कम से कम एक ब्राउज़र उपलब्ध है या कोई खास ब्राउज़र डिफ़ॉल्ट ब्राउज़र है. ऐसे मामलों में, अपने मेनिफ़ेस्ट में <queries> एलिमेंट के हिस्से के तौर पर, यह <intent> एलिमेंट शामिल करें:

<!-- Place inside the <queries> element. -->
<intent>
  <action android:name="android.intent.action.VIEW" />
  <category android:name="android.intent.category.BROWSABLE" />
  <data android:scheme="https" />
</intent>

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

कस्टम टैब में यूआरएल खोलना

कस्टम टैब की मदद से, कोई ऐप्लिकेशन ब्राउज़र के लुक और स्टाइल को पसंद के मुताबिक बना सकता है. अपने ऐप्लिकेशन मेनिफ़ेस्ट में <queries> एलिमेंट को जोड़े या बदले बिना, किसी यूआरएल को कस्टम टैब में खोला जा सकता है.

हालांकि, आपको यह देखना पड़ सकता है कि डिवाइस में ऐसा ब्राउज़र है या नहीं जो कस्टम टैब के साथ काम करता हो. इसके अलावा, CustomTabsClient.getPackageName() का इस्तेमाल करके, कस्टम टैब के साथ लॉन्च करने के लिए कोई खास ब्राउज़र चुना जा सकता है. ऐसे मामलों में, अपने मेनिफ़ेस्ट में <queries> एलिमेंट के हिस्से के तौर पर, यहां दिया गया <intent> एलिमेंट शामिल करें:

<!-- Place inside the <queries> element. -->
<intent>
  <action android:name="android.support.customtabs.action.CustomTabsService" />
</intent>

ब्राउज़र के अलावा अन्य ऐप्लिकेशन को यूआरएल मैनेज करने की अनुमति दें

अगर आपका ऐप्लिकेशन कस्टम टैब का इस्तेमाल करके यूआरएल खोल सकता है, तो हमारा सुझाव है कि आप किसी ऐसे ऐप्लिकेशन को यूआरएल खोलने की अनुमति दें जो ब्राउज़र नहीं है. अपने ऐप्लिकेशन में यह सुविधा देने के लिए, startActivity() को कॉल करने की कोशिश करें. इसके लिए, ऐसे इंटेंट का इस्तेमाल करें जो FLAG_ACTIVITY_REQUIRE_NON_BROWSER इंटेंट फ़्लैग सेट करता हो. अगर सिस्टम ActivityNotFoundException दिखाता है, तो आपका ऐप्लिकेशन यूआरएल को कस्टम टैब में खोल सकता है.

अगर किसी इंटेंट में यह फ़्लैग शामिल है, तो startActivity() को कॉल करने पर, इनमें से कोई भी शर्त पूरी होने पर ActivityNotFoundException थ्रो हो जाता है:

  • इस कॉल से, ब्राउज़र ऐप्लिकेशन सीधे लॉन्च हो जाता.
  • इस कॉल में, उपयोगकर्ता को एक डायलॉग बॉक्स दिखाया जाता है. इसमें सिर्फ़ ब्राउज़र ऐप्लिकेशन के विकल्प होते हैं.

नीचे दिए गए कोड स्निपेट में, FLAG_ACTIVITY_REQUIRE_NON_BROWSER इंटेंट फ़्लैग का इस्तेमाल करने के लिए, अपने लॉजिक को अपडेट करने का तरीका बताया गया है:

Kotlin

try {
    val intent = Intent(ACTION_VIEW, Uri.parse(url)).apply {
        // The URL should either launch directly in a non-browser app (if it's
        // the default) or in the disambiguation dialog.
        addCategory(CATEGORY_BROWSABLE)
        flags = FLAG_ACTIVITY_NEW_TASK or FLAG_ACTIVITY_REQUIRE_NON_BROWSER
    }
    startActivity(intent)
} catch (e: ActivityNotFoundException) {
    // Only browser apps are available, or a browser is the default.
    // So you can open the URL directly in your app, for example in a
    // Custom Tab.
    openInCustomTabs(url)
}

Java

try {
    Intent intent = new Intent(ACTION_VIEW, Uri.parse(url));
    // The URL should either launch directly in a non-browser app (if it's the
    // default) or in the disambiguation dialog.
    intent.addCategory(CATEGORY_BROWSABLE);
    intent.setFlags(FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_REQUIRE_NON_BROWSER);
    startActivity(intent);
} catch (ActivityNotFoundException e) {
    // Only browser apps are available, or a browser is the default.
    // So you can open the URL directly in your app, for example in a
    // Custom Tab.
    openInCustomTabs(url);
}

एक से ज़्यादा मतलब वाले शब्दों के लिए डायलॉग बॉक्स से बचना

अगर आपको यूज़र को दिखने वाले, disambiguation डायलॉग बॉक्स को नहीं दिखाना है और इन स्थितियों में यूआरएल को खुद मैनेज करना है, तो FLAG_ACTIVITY_REQUIRE_DEFAULT इंटेंट फ़्लैग सेट करने वाले इंटेंट का इस्तेमाल किया जा सकता है.

अगर किसी इंटेंट में यह फ़्लैग शामिल है, तो startActivity() को कॉल करने पर ActivityNotFoundException थ्रो हो जाता है. ऐसा तब होता है, जब कॉल करने पर उपयोगकर्ता को disambiguation डायलॉग दिखाया जाता है.

अगर किसी इंटेंट में इस फ़्लैग और FLAG_ACTIVITY_REQUIRE_NON_BROWSER इंटेंट फ़्लैग, दोनों को शामिल किया गया है, तो startActivity() को कॉल करने पर ActivityNotFoundException तब थ्रो होता है, जब इनमें से कोई एक शर्त पूरी होती है:

  • इस कॉल से, ब्राउज़र ऐप्लिकेशन सीधे लॉन्च हो जाता.
  • कॉल में, उपयोगकर्ता को एक डायलॉग बॉक्स दिखाया जाता है, ताकि वह अपनी क्वेरी को ज़्यादा साफ़ तौर पर बता सके.

यहां दिए गए कोड स्निपेट में बताया गया है कि FLAG_ACTIVITY_REQUIRE_NON_BROWSER और FLAG_ACTIVITY_REQUIRE_DEFAULT फ़्लैग का एक साथ इस्तेमाल कैसे किया जाता है:

Kotlin

val url = URL_TO_LOAD
try {
    // For this intent to be invoked, the system must directly launch a
    // non-browser app.
    val intent = Intent(ACTION_VIEW, Uri.parse(url)).apply {
        addCategory(CATEGORY_BROWSABLE)
        flags = FLAG_ACTIVITY_NEW_TASK or FLAG_ACTIVITY_REQUIRE_NON_BROWSER or
                FLAG_ACTIVITY_REQUIRE_DEFAULT
    }
    startActivity(intent)
} catch (e: ActivityNotFoundException) {
    // This code executes in one of the following cases:
    // 1. Only browser apps can handle the intent.
    // 2. The user has set a browser app as the default app.
    // 3. The user hasn't set any app as the default for handling this URL.
    openInCustomTabs(url)
}

Java

String url = URL_TO_LOAD;
try {
    // For this intent to be invoked, the system must directly launch a
    // non-browser app.
    Intent intent = new Intent(ACTION_VIEW, Uri.parse(url));
    intent.addCategory(CATEGORY_BROWSABLE);
    intent.setFlags(FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_REQUIRE_NON_BROWSER |
            FLAG_ACTIVITY_REQUIRE_DEFAULT);
    startActivity(intent);
} catch (ActivityNotFoundException e) {
    // This code executes in one of the following cases:
    // 1. Only browser apps can handle the intent.
    // 2. The user has set a browser app as the default app.
    // 3. The user hasn't set any app as the default for handling this URL.
    openInCustomTabs(url);
}

फ़ाइल खोलें

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

अगर आपके ऐप्लिकेशन को पहले से यह पता होना चाहिए कि कोई दूसरा ऐप्लिकेशन किसी फ़ाइल को खोल सकता है या नहीं, तो मेनिफ़ेस्ट में मौजूद <queries> एलिमेंट के हिस्से के तौर पर, कोड के इस स्निपेट में <intent> एलिमेंट शामिल करें. अगर आपको कंपाइल टाइम पर फ़ाइल टाइप के बारे में पहले से पता है, तो उसे शामिल करें.

<!-- Place inside the <queries> element. -->
<intent>
  <action android:name="android.intent.action.VIEW" />
  <!-- If you don't know the MIME type in advance, set "mimeType" to "*/*". -->
  <data android:mimeType="application/pdf" />
</intent>

इसके बाद, अपने इंटेंट के साथ resolveActivity() को कॉल करके, यह देखा जा सकता है कि कोई ऐप्लिकेशन उपलब्ध है या नहीं.

यूआरआई का ऐक्सेस देना

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

Android 11 या इसके बाद के वर्शन को टारगेट करने वाले ऐप्लिकेशन को कॉन्टेंट यूआरआई ऐक्सेस करने के लिए, अपने ऐप्लिकेशन के इंटेंट में यूआरआई ऐक्सेस करने की अनुमतियां का एलान करना होगा. इसके लिए, इंटेंट के इन फ़्लैग में से एक या दोनों को सेट करना होगा: FLAG_GRANT_READ_URI_PERMISSION और FLAG_GRANT_WRITE_URI_PERMISSION.

Android 11 और इसके बाद के वर्शन में, यूआरआई ऐक्सेस करने की अनुमतियों से, इंटेंट पाने वाले ऐप्लिकेशन को ये सुविधाएं मिलती हैं:

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

नीचे दिए गए कोड स्निपेट में, यूआरआई की अनुमतियों के लिए इंटेंट फ़्लैग जोड़ने का तरीका बताया गया है. इससे Android 11 या इसके बाद के वर्शन को टारगेट करने वाला कोई अन्य ऐप्लिकेशन, कॉन्टेंट यूआरआई में मौजूद डेटा को देख सकता है:

Kotlin

val shareIntent = Intent(Intent.ACTION_VIEW).apply {
    flags = Intent.FLAG_GRANT_READ_URI_PERMISSION
    data = CONTENT_URI_TO_SHARE_WITH_OTHER_APP
}

Java

Intent shareIntent = new Intent(Intent.ACTION_VIEW);
shareIntent.setFlags(FLAG_GRANT_READ_URI_PERMISSION);
shareIntent.setData(CONTENT_URI_TO_SHARE_WITH_OTHER_APP);

सेवाओं से कनेक्ट करना

अगर आपके ऐप्लिकेशन को ऐसी सेवा के साथ इंटरैक्ट करना है जो अपने-आप नहीं दिखती, तो <queries> एलिमेंट में सही इंटेंट ऐक्शन का एलान किया जा सकता है. यहां कुछ उदाहरण दिए गए हैं. इनमें आम तौर पर इस्तेमाल की जाने वाली सेवाओं का इस्तेमाल किया गया है.

लिखे गए शब्दों को सुनने की सुविधा देने वाले इंजन से कनेक्ट करना

अगर आपका ऐप्लिकेशन, लिखाई को बोली में बदलने (टीटीएस) वाले इंजन के साथ इंटरैक्ट करता है, तो अपने मेनिफ़ेस्ट में <queries> एलिमेंट के हिस्से के तौर पर, यहां दिया गया <intent> एलिमेंट शामिल करें:

<!-- Place inside the <queries> element. -->
<intent>
  <action android:name="android.intent.action.TTS_SERVICE" />
</intent>

बोली पहचानने की सेवा से कनेक्ट करना

अगर आपका ऐप्लिकेशन, बोली पहचानने की सेवा के साथ इंटरैक्ट करता है, तो अपने मेनिफ़ेस्ट में <queries> एलिमेंट के हिस्से के तौर पर, यह <intent> एलिमेंट शामिल करें:

<!-- Place inside the <queries> element. -->
<intent>
  <action android:name="android.speech.RecognitionService" />
</intent>

मीडिया ब्राउज़र सेवाओं से कनेक्ट करें

अगर आपका ऐप्लिकेशन, क्लाइंट मीडिया ब्राउज़र ऐप्लिकेशन है, तो अपने मेनिफ़ेस्ट में <queries> एलिमेंट के हिस्से के तौर पर, यहां दिया गया <intent> एलिमेंट शामिल करें:

<!-- Place inside the <queries> element. -->
<intent>
  <action android:name="android.media.browse.MediaBrowserService" />
</intent>

पसंद के मुताबिक फ़ंक्शन उपलब्ध कराना

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

एसएमएस ऐप्लिकेशन के लिए क्वेरी करना

अगर आपके ऐप्लिकेशन को डिवाइस पर इंस्टॉल किए गए एसएमएस ऐप्लिकेशन के सेट के बारे में जानकारी चाहिए, तो अपने मेनिफ़ेस्ट में <queries> एलिमेंट के हिस्से के तौर पर, यहां दिया गया <intent> एलिमेंट शामिल करें. उदाहरण के लिए, यह देखने के लिए कि डिवाइस का डिफ़ॉल्ट एसएमएस हैंडलर कौन-सा ऐप्लिकेशन है:

<!-- Place inside the <queries> element. -->
<intent>
  <action android:name="android.intent.action.SENDTO"/>
  <data android:scheme="smsto" android:host="*" />
</intent>

कस्टम शेयरशीट बनाना

जब भी हो सके, सिस्टम की ओर से उपलब्ध कराई गई शेयरशीट का इस्तेमाल करें. इसके अलावा, अपने मेनिफ़ेस्ट में <queries> एलिमेंट के हिस्से के तौर पर, यहां दिया गया <intent> एलिमेंट शामिल करें:

<!-- Place inside the <queries> element. -->
<intent>
  <action android:name="android.intent.action.SEND" />
  <!-- Replace with the MIME type that your app works with, if needed. -->
  <data android:mimeType="image/jpeg" />
</intent>

आपके ऐप्लिकेशन के लॉजिक में शेयरशीट बनाने की प्रोसेस, Android 11 से पहले के Android वर्शन की तुलना में नहीं बदली है. जैसे, queryIntentActivities() को कॉल करना.

कस्टम टेक्स्ट चुनने की कार्रवाइयां दिखाना

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

<!-- Place inside the <queries> element. -->
<intent>
  <action android:name="android.intent.action.PROCESS_TEXT" />
  <data android:mimeType="text/plain" />
</intent>

किसी संपर्क के लिए कस्टम डेटा की लाइनें दिखाना

ऐप्लिकेशन, ContactsProvider में कस्टम डेटा लाइनें जोड़ सकते हैं. संपर्क जानकारी वाले ऐप्लिकेशन को यह कस्टम डेटा दिखाने के लिए, इन कामों को पूरा करना होगा:

  1. दूसरे ऐप्लिकेशन से contacts.xml फ़ाइल को पढ़ सकता है.
  2. कस्टम MIME टाइप से मेल खाने वाला आइकॉन लोड करता है.

अगर आपका ऐप्लिकेशन, संपर्कों से जुड़ा ऐप्लिकेशन है, तो अपने मेनिफ़ेस्ट में <queries> एलिमेंट के हिस्से के तौर पर, ये <intent> एलिमेंट शामिल करें:

<!-- Place inside the <queries> element. -->
<!-- Lets the app read the contacts.xml file from other apps. -->
<intent>
  <action android:name="android.accounts.AccountAuthenticator" />
</intent>
<!-- Lets the app load an icon corresponding to the custom MIME type. -->
<intent>
  <action android:name="android.intent.action.VIEW" />
  <data android:scheme="content" android:host="com.android.contacts"
        android:mimeType="vnd.android.cursor.item/*" />
</intent>