अन्य ऐप्लिकेशन से डेटा पाना

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

Compose Navigation का इस्तेमाल करने वाले किसी ऐप्लिकेशन में, दूसरे ऐप्लिकेशन से भेजा गया डेटा पाने की प्रोसेस तीन चरणों में पूरी होती है:

  1. मेनिफ़ेस्ट में <intent-filter> का एलान करें: आपको अब भी AndroidManifest.xml फ़ाइल में अपनी गतिविधि के लिए इंटेंट फ़िल्टर जोड़ना होगा. इससे Android OS को पता चलता है कि आपका ऐप्लिकेशन, ACTION_SEND जैसी कुछ कार्रवाइयां और text/plain जैसे एमआईएमई टाइप को स्वीकार कर सकता है.

  2. अपने Compose नेविगेशन ग्राफ़ में navDeepLink तय करें: कार्रवाई और एमआईएमई टाइप से मैच होने वाले navDeepLink को सीधे उस कंपोज़ेबल डेस्टिनेशन से अटैच करें जिसमें कॉन्टेंट दिखाना है. NavController, इनकमिंग इंटेंट को अपने-आप इंटरसेप्ट करता है और उपयोगकर्ता को सीधे उस स्क्रीन पर ले जाता है.

  3. इनकमिंग डेटा पेलोड को एक्सट्रैक्ट करना: डेस्टिनेशन स्क्रीन पर, इंटेंट एक्स्ट्रा (जैसे, EXTRA_TEXT या EXTRA_STREAM) को ऐक्सेस करें, ताकि शेयर किए गए कॉन्टेंट को वापस लाया जा सके और यूज़र इंटरफ़ेस (यूआई) की स्थिति को अपडेट किया जा सके.

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

एमआईएमई टाइप के साथ काम करना

आम तौर पर, किसी ऐप्लिकेशन को ज़्यादा से ज़्यादा एमआईएमई टाइप की फ़ाइलें स्वीकार करनी चाहिए. उदाहरण के लिए, टेक्स्ट, इमेज, और वीडियो भेजने के लिए डिज़ाइन किया गया कोई मैसेजिंग ऐप्लिकेशन, आम तौर पर text/*, image/*, और video/* को पाने की सुविधा देता है. Android में डेटा भेजने और पाने के लिए, यहां कुछ सामान्य एमआईएमई टाइप दिए गए हैं.

उपहार पाने वाले लोग, इसके लिए रजिस्टर करते हैं ईमेल भेजने वाले लोग, ईमेल भेजते हैं
text/*
  • text/plain
  • text/rtf
  • text/html
  • text/json
image/*
  • image/jpg
  • image/png
  • image/gif
video/*
  • video/mp4
  • video/3gp
इस्तेमाल किए जा सकने वाले फ़ाइल एक्सटेंशन application/pdf

एमआईएमई मीडिया टाइप की आईएएनए आधिकारिक रजिस्ट्री देखें.

शेयर करने के लिए बेहतरीन टारगेट बनाएं

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

अपने ऐप्लिकेशन में डेटा पाना

Compose का इस्तेमाल करके किसी ऐप्लिकेशन में शेयर किया गया डेटा पाने के लिए, आपको अपने मेनिफ़ेस्ट में इंटेंट फ़िल्टर का एलान करना होगा. साथ ही, आने वाले इंटेंट को डीप लिंक की मदद से सही स्क्रीन पर रूट करना होगा. इसके अलावा, अपने यूज़र इंटरफ़ेस (यूआई) को अपडेट करने के लिए, इंटेंट से पेलोड निकालना होगा.

मेनिफ़ेस्ट अपडेट करना

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

<activity android:name=".ui.MyActivity" android:exported="true">
    <intent-filter>
        <action android:name="android.intent.action.SEND" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:mimeType="image/*" />
    </intent-filter>
    <intent-filter>
        <action android:name="android.intent.action.SEND" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:mimeType="text/plain" />
    </intent-filter>
    <intent-filter>
        <action android:name="android.intent.action.SEND_MULTIPLE" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:mimeType="image/*" />
    </intent-filter>
</activity>

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

Compose Navigation में, navDeepLink को सीधे उस कंपोज़ेबल डेस्टिनेशन से अटैच करें जिसमें कॉन्टेंट दिखाना है. जब कोई दूसरा ऐप्लिकेशन ऐसा डेटा शेयर करता है जो आपके इंटेंट फ़िल्टर से मैच करता है, तो Compose Navigation उपयोगकर्ता को सीधे इस डेस्टिनेशन पर ले जाता है:

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

आने वाले कॉन्टेंट को मैनेज करना

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

आने वाले डेटा की जांच करते समय ज़्यादा सावधानी बरतें: हो सकता है कि गलत एमआईएमई टाइप सेट किया गया हो या भेजी जा रही इमेज बहुत बड़ी हो. बाइनरी डेटा या हैवी I/O कार्रवाइयों (जैसे, बड़ी इमेज को डिकोड करना या फ़ाइलें लिखना) को मुख्य यूज़र इंटरफ़ेस (यूआई) थ्रेड के बजाय, कोरूटीन (जैसे कि Dispatchers.IO) का इस्तेमाल करके एसिंक्रोनस तरीके से प्रोसेस करें.

@Composable
fun SharesheetHandler() {
    val activity = LocalActivity.current
    val intent = activity?.intent

    when (intent?.action) {
        Intent.ACTION_SEND -> {
            if (intent.type == "text/plain") {
                handleSendText(intent) // Handle text being sent
            } else if (intent.type?.startsWith("image/") == true) {
                handleSendImage(intent) // Handle single image being sent
            }
        }

        Intent.ACTION_SEND_MULTIPLE -> {
            if (intent.type?.startsWith("image/") == true) {
                handleSendMultipleImages(intent) // Handle multiple images being sent
            }
        }

        else -> {
            // Handle other intents, such as being started from the home screen
        }
    }
}

private fun handleSendText(intent: Intent) {
    intent.getStringExtra(Intent.EXTRA_TEXT)?.let {
        // Update UI state with the shared text
    }
}

private fun handleSendImage(intent: Intent) {
    val imageUri = IntentCompat.getParcelableExtra(intent, Intent.EXTRA_STREAM, Uri::class.java)
    imageUri?.let {
        // Update UI state with the shared image
    }
}

private fun handleSendMultipleImages(intent: Intent) {
    val imageUris =
        IntentCompat.getParcelableArrayListExtra(intent, Intent.EXTRA_STREAM, Uri::class.java)
    imageUris?.let {
        // Update UI state with the shared images
    }
}

इंटेंट एक्स्ट्रा (जैसे कि EXTRA_STREAM) से बाइनरी डेटा या यूआरआई निकालते समय, AndroidX Core लाइब्रेरी से IntentCompat.getParcelableExtra() या IntentCompat.getParcelableArrayListExtra() का इस्तेमाल करें. जैसा कि ऊपर दिए गए handleSendImage और handleSendMultipleImages फ़ंक्शन में दिखाया गया है. Android 13 (एपीआई लेवल 33) में, बिना पैरामीटर वाले Intent.getParcelableExtra(String) तरीके को बंद कर दिया गया है. इसकी जगह, टाइप-सेफ़ तरीकों का इस्तेमाल किया जाता है. इनमें, क्लास के टाइप की जानकारी दी जाती है.

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

स्क्रीनशॉट का यूआरएल शेयर करना

स्क्रीनशॉट लेते समय, स्क्रीनशॉट और उससे जुड़ा कोई भी यूआरएल शेयर किया जा सकता है. इससे उपयोगकर्ता को बेहतर अनुभव मिलता है. यूआरएल मिलने पर, इंटेंट से EXTRA_TEXT फ़ील्ड ज़रूर पाएं. इसके बारे में यहां दिए गए उदाहरण में बताया गया है:

IntentCompat.getParcelableExtra(intent, Intent.EXTRA_STREAM, Uri::class.java).let {
    // Handle the EXTRA_TEXT as well
    val extraText = intent.getCharSequenceExtra(Intent.EXTRA_TEXT)
    // Update UI state with the shared image and the EXTRA_TEXT if available
}

पक्का करना कि उपयोगकर्ता आपके ऐप्लिकेशन को पहचानें

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

Android 10 (एपीआई लेवल 29) से, Android शेयरशीट सिर्फ़ उन आइकॉन का इस्तेमाल करती है जो आपके application टैग पर मेनिफ़ेस्ट में सेट किए गए हैं. Android, intent-filter और activity टैग पर सेट किए गए आइकॉन को अनदेखा कर देता है.

रिच कॉन्टेंट पाना

ACTION_SEND इंटेंट की मदद से, गतिविधि या नेविगेशन लेवल पर Android शेयरशीट और इंटेंट रिज़ॉल्वर से डेटा पाया जा सकता है. इसके अलावा, ऐप्लिकेशन सीधे यूज़र इंटरफ़ेस (यूआई) इंटरैक्शन के ज़रिए भी रिच कॉन्टेंट (जैसे, इमेज, वीडियो, ऑडियो फ़ाइलें, और स्टाइल किया गया टेक्स्ट) पा सकते हैं. इन तरीकों में ये शामिल हैं:

  • क्लिपबोर्ड से चिपकाना (दबाकर रखने पर दिखने वाला मेन्यू)
  • सॉफ़्टवेयर कीबोर्ड (आईएमई) से सीधे मीडिया डालना, जैसे कि स्टिकर या GIF
  • मल्टी-विंडो या स्प्लिट-स्क्रीन मोड में, किसी दूसरे ऐप्लिकेशन से कॉन्टेंट को खींचें और छोड़ें

व्यू-आधारित यूज़र इंटरफ़ेस (यूआई) में, Android 12 (एपीआई लेवल 31) और AndroidX Core 1.7, यूनिफ़ाइड OnReceiveContentListener एपीआई को पेश करते हैं. यह लिसनर, क्लिपबोर्ड, कीबोर्ड, और खींचने और छोड़ने की सुविधा से कॉन्टेंट को मैनेज करने की प्रोसेस को एक ही कॉलबैक में जोड़ता है. व्यू में इसे लागू करने के बारे में ज़्यादा जानकारी पाने के लिए, रिच कॉन्टेंट पाना लेख पढ़ें.

Jetpack Compose में, यूआई कॉम्पोनेंट (जैसे, टेक्स्ट फ़ील्ड) में डाले गए रिच कॉन्टेंट को मैनेज किया जा सकता है. इसके लिए, Modifier.contentReceiver मॉडिफ़ायर या खींचने और छोड़ने वाले मॉडिफ़ायर का इस्तेमाल करें.