जिस तरह कोई ऐप्लिकेशन, दूसरे ऐप्लिकेशन को डेटा भेज सकता है उसी तरह वह दूसरे ऐप्लिकेशन से डेटा पा भी सकता है. इस बारे में सोचें कि उपयोगकर्ता आपके ऐप्लिकेशन से कैसे इंटरैक्ट करते हैं और आपको दूसरे ऐप्लिकेशन से किस तरह का डेटा चाहिए. उदाहरण के लिए, किसी सोशल नेटवर्किंग ऐप्लिकेशन को दूसरे ऐप्लिकेशन से टेक्स्ट कॉन्टेंट मिल सकता है. जैसे, कोई दिलचस्प वेब यूआरएल.
Compose Navigation का इस्तेमाल करने वाले किसी ऐप्लिकेशन में, दूसरे ऐप्लिकेशन से भेजा गया डेटा पाने के लिए, दो चरणों वाली प्रोसेस अपनाई जाती है:
मेनिफ़ेस्ट में
<intent-filter>तय करना: आपको AndroidManifest.xml फ़ाइल में, अपनी ऐक्टिविटी में इंटेंट फ़िल्टर जोड़ना होगा. इससे Android OS को पता चलता है कि आपका ऐप्लिकेशन, खास कार्रवाइयां (जैसे, ACTION_SEND) और MIME टाइप (जैसे, text/plain) पा सकता है.Compose Navigation ग्राफ़ में navDeepLink तय करना: अपनी ऐक्टिविटी के onCreate या onNewIntent तरीकों में, इंटेंट को मैन्युअल तरीके से इंटरसेप्ट और पार्स करने के बजाय, Compose Navigation के डीप लिंक की सुविधा का इस्तेमाल करें. कॉन्टेंट दिखाने वाले कंपोज़ेबल डेस्टिनेशन में, सीधे तौर पर ऐसा navDeepLink अटैच करें जो कार्रवाई और एमआईएमई टाइप से मेल खाता हो. NavController, इंटेंट को अपने-आप इंटरसेप्ट कर लेगा और उपयोगकर्ता को सीधे उस स्क्रीन पर भेज देगा.
सीधे तौर पर कॉन्टेंट शेयर करने के लिए चुने गए लोग या ग्रुप, आपके ऐप्लिकेशन में मौजूद किसी खास ऐक्टिविटी के डीप लिंक होते हैं. ये अक्सर किसी व्यक्ति या ग्रुप को दिखाते हैं. Android Sharesheet में, ये दिखते हैं. उदाहरण के लिए, कोई मैसेजिंग ऐप्लिकेशन, किसी व्यक्ति के लिए सीधे तौर पर कॉन्टेंट शेयर करने के लिए चुने गए लोग या ग्रुप की सुविधा दे सकता है. इससे सीधे उस व्यक्ति के साथ बातचीत शुरू हो जाती है. ज़्यादा जानकारी के लिए, सीधे तौर पर कॉन्टेंट शेयर करने के लिए चुने गए लोग या ग्रुप की सुविधा देना लेख पढ़ें.
MIME टाइप के साथ काम करना
आदर्श तौर पर, किसी ऐप्लिकेशन में ज़्यादा से ज़्यादा MIME टाइप पाने की क्षमता होनी चाहिए.
उदाहरण के लिए, टेक्स्ट, इमेज, और वीडियो भेजने के लिए डिज़ाइन किए गए किसी मैसेजिंग ऐप्लिकेशन में, text/*, image/* और video/* पाने की सुविधा होनी चाहिए. Android में, सामान्य डेटा भेजने और पाने के लिए, यहां कुछ सामान्य MIME टाइप दिए गए हैं.
| पाने वाले ऐप्लिकेशन, इनके लिए रजिस्टर करते हैं | भेजने वाले ऐप्लिकेशन, इन्हें भेजते हैं |
|---|---|
text/* |
|
image/* |
|
video/* |
|
| इस्तेमाल किए जा सकने वाले फ़ाइल एक्सटेंशन | application/pdf |
MIME मीडिया टाइप की आधिकारिक रजिस्ट्री के लिए, IANA पर जाएं.
सीधे तौर पर कॉन्टेंट शेयर करने के लिए चुने गए लोग या ग्रुप की सुविधा को बेहतर बनाना
जब कोई उपयोगकर्ता, किसी खास ऐक्टिविटी से जुड़े सीधे तौर पर कॉन्टेंट शेयर करने के लिए चुने गए लोग या ग्रुप पर टैप करता है, तो उसके पास शेयर किए गए कॉन्टेंट का इस्तेमाल करने से पहले, उसकी पुष्टि करने और उसमें बदलाव करने का विकल्प होना चाहिए. यह टेक्स्ट डेटा के लिए खास तौर पर ज़रूरी है.
किसी ऐक्टिविटी के साथ डेटा पाना
किसी ऐक्टिविटी के साथ डेटा पाने के लिए, आपको अपना मेनिफ़ेस्ट अपडेट करना होगा, आने वाले कॉन्टेंट को हैंडल करना होगा, और यह पक्का करना होगा कि उपयोगकर्ता आपके ऐप्लिकेशन को पहचानें.
अपना मेनिफ़ेस्ट अपडेट करना
इंटेंट फ़िल्टर, सिस्टम को बताते हैं कि कोई ऐप्लिकेशन कॉम्पोनेंट किन इंटेंट को स्वीकार करता है.
जिस तरह आपने अन्य ऐप्लिकेशन को सामान्य डेटा भेजना लेख में, ACTION_SEND कार्रवाई के साथ इंटेंट बनाया था उसी तरह इस कार्रवाई के साथ इंटेंट पाने के लिए, इंटेंट फ़िल्टर बनाएं. मेनिफ़ेस्ट में, <intent-filter> एलिमेंट का इस्तेमाल करके, इंटेंट फ़िल्टर तय करें.
उदाहरण के लिए, अगर आपका ऐप्लिकेशन टेक्स्ट कॉन्टेंट पाने की सुविधा देता है, तो किसी भी तरह की एक या उससे ज़्यादा इमेज वाले मेनिफ़ेस्ट का स्निपेट इस तरह दिखेगा:
<activity android:name=".ui.MyActivity" > <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 Sharesheet या इंटेंट रिज़ॉल्वर में एक विकल्प के तौर पर दिखता है. अगर उपयोगकर्ता आपका ऐप्लिकेशन चुनता है, तो इससे संबंधित ऐक्टिविटी (.ui.MyActivity पिछले उदाहरण में) शुरू हो जाती है. इसके बाद, यह तय करना आपके ऊपर है कि आपको अपने कोड और यूज़र इंटरफ़ेस (यूआई) में कॉन्टेंट को कैसे हैंडल करना है.
आने वाले कॉन्टेंट को हैंडल करना
Intent से डिलीवर किए गए कॉन्टेंट को हैंडल करने के लिए, Intent ऑब्जेक्ट पाने के लिए
getIntent() को कॉल करें. ऑब्जेक्ट मिलने के बाद, यह तय करने के लिए कि आगे क्या करना है, उसके कॉन्टेंट की जांच की जा सकती है. अगर इस ऐक्टिविटी को सिस्टम के अन्य हिस्सों (जैसे, लॉन्चर) से शुरू किया जा सकता है, तो इंटेंट की जांच करते समय इस बात का ध्यान रखें.
आने वाले डेटा की जांच करने में ज़्यादा सावधानी बरतें. आपको नहीं पता कि कोई दूसरा ऐप्लिकेशन आपको क्या भेज सकता है. उदाहरण के लिए, गलत MIME टाइप सेट किया जा सकता है या भेजी जा रही इमेज बहुत बड़ी हो सकती है. इसके अलावा, बाइनरी डेटा को मुख्य ("यूआई") थ्रेड के बजाय, किसी अलग थ्रेड में प्रोसेस करना न भूलें.
@Composable fun SharesheetHandler() { val context = LocalContext.current val intent = (context as? Activity)?.intent when (intent?.action) { ACTION_SEND -> { if ("text/plain" == intent.type) { 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 } } } fun handleSendText(intent: Intent) { intent.getStringExtra(Intent.EXTRA_TEXT)?.let { // Update ViewModel state to change state of text being shared } } fun handleSendImage(intent: Intent) { IntentCompat.getParcelableExtra(intent, Intent.EXTRA_STREAM, Uri::class.java).let { // Update ViewModel state to change state of image being shared } } fun handleSendMultipleImages(intent: Intent) { IntentCompat.getParcelableArrayListExtra(intent, Intent.EXTRA_STREAM, Uri::class.java).let { // Update ViewModel state to change state of image(s) being shared } }
डेटा मिलने के बाद, यूज़र इंटरफ़ेस (यूआई) को अपडेट करना,
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 ViewModel state to change state image being shared and the EXTRA_TEXT // if available }
पक्का करें कि उपयोगकर्ता आपके ऐप्लिकेशन को पहचानें
Android Sharesheet और इंटेंट रिज़ॉल्वर में, आपका ऐप्लिकेशन उसके आइकॉन और लेबल से दिखता है. ये दोनों, मेनिफ़ेस्ट में तय किए जाते हैं. ज़्यादा जानकारी देने के लिए, ऐक्टिविटी या इंटेंट फ़िल्टर के लेबल सेट किए जा सकते हैं.
Android 10 (एपीआई लेवल 29) से, Android Sharesheet सिर्फ़ आपके application टैग पर मेनिफ़ेस्ट में सेट किए गए आइकॉन का इस्तेमाल करता है. Android, intent-filter और activity टैग पर सेट किए गए आइकॉन को नज़रअंदाज़ कर देता है.