जिस तरह कोई ऐप्लिकेशन, दूसरे ऐप्लिकेशन को डेटा भेज सकता है उसी तरह वह दूसरे ऐप्लिकेशन से डेटा पा भी सकता है. सोचें कि उपयोगकर्ता आपके ऐप्लिकेशन से कैसे इंटरैक्ट करते हैं और आपको अन्य ऐप्लिकेशन से किस तरह का डेटा चाहिए. उदाहरण के लिए, किसी सोशल नेटवर्किंग ऐप्लिकेशन को किसी दूसरे ऐप्लिकेशन से टेक्स्ट कॉन्टेंट मिल सकता है. जैसे, कोई दिलचस्प वेब यूआरएल.
अन्य ऐप्लिकेशन के उपयोगकर्ता, Android की शेयरशीट या इंटेंट रिज़ॉल्वर के ज़रिए आपके ऐप्लिकेशन को अक्सर डेटा भेजते हैं. आपके ऐप्लिकेशन को डेटा भेजने वाले ऐप्लिकेशन को, उस डेटा के लिए MIME टाइप सेट करना होगा. आपका ऐप्लिकेशन, किसी दूसरे ऐप्लिकेशन से भेजे गए डेटा को इन तरीकों से पा सकता है:
- मेनिफ़ेस्ट में, मेल खाने वाले
intent-filter
टैग के साथ एकActivity
- आपके ऐप्लिकेशन से पब्लिश किए गए शेयर करने के शॉर्टकट.
डायरेक्ट शेयर के टारगेट, आपके ऐप्लिकेशन में किसी खास गतिविधि के डीप लिंक होते हैं. ये अक्सर किसी व्यक्ति या ग्रुप को दिखाते हैं. साथ ही, Android की शेयरशीट में इन्हें दिखाया जाता है. उदाहरण के लिए, कोई मैसेजिंग ऐप्लिकेशन किसी व्यक्ति के लिए डायरेक्ट शेयर का टारगेट उपलब्ध करा सकता है. इससे उस व्यक्ति के साथ बातचीत करने के लिए सीधे डीप लिंक किया जा सकता है. ज़्यादा जानकारी के लिए, Direct Share के टारगेट उपलब्ध कराना देखें.
सपोर्ट किए जाने वाले MIME टाइप
आदर्श रूप से, किसी ऐप्लिकेशन को ज़्यादा से ज़्यादा MIME टाइप मिलनी चाहिए.
उदाहरण के लिए, टेक्स्ट, इमेज, और वीडियो भेजने के लिए डिज़ाइन किया गया मैसेजिंग ऐप्लिकेशन, text/*
, image/*
, और video/*
पाने की सुविधा देता है. Android में सामान्य डेटा भेजने और पाने के लिए, यहां कुछ सामान्य एमआईएमई टाइप दिए गए हैं.
ईमेल पाने वाले लोग इसके लिए रजिस्टर करते हैं | ईमेल भेजने वाले लोग |
---|---|
text/* |
|
`image/*` |
|
video/* |
|
साथ काम करने वाले फ़ाइल एक्सटेंशन | application/pdf |
एमआईएमई मीडिया टाइप की आईएएनए की आधिकारिक रजिस्ट्री देखें.
शेयर करने के लिए बेहतरीन टारगेट बनाना
जब कोई उपयोगकर्ता किसी गतिविधि से जुड़े शेयर टारगेट पर टैप करता है, तो उसके पास शेयर किए गए कॉन्टेंट का इस्तेमाल करने से पहले, उसकी पुष्टि करने और उसे बदलने का विकल्प होना चाहिए. यह खास तौर पर टेक्स्ट डेटा के लिए ज़रूरी है.
किसी गतिविधि के साथ डेटा पाना
किसी गतिविधि के साथ डेटा पाने के लिए, आपको मेनिफ़ेस्ट अपडेट करना होगा, आने वाले कॉन्टेंट को हैंडल करना होगा, और यह पक्का करना होगा कि उपयोगकर्ता आपके ऐप्लिकेशन को पहचानता हो.
मेनिफ़ेस्ट अपडेट करना
इंटेंट फ़िल्टर, सिस्टम को यह बताते हैं कि ऐप्लिकेशन का कोई कॉम्पोनेंट किन इंटेंट को स्वीकार करता है.
दूसरे ऐप्लिकेशन को सामान्य डेटा भेजना लेसन में, आपने 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 की शेयरशीट या इंटेंट रिज़ॉल्वर में एक विकल्प के तौर पर दिखता है. अगर उपयोगकर्ता आपका ऐप्लिकेशन चुनता है, तो इससे उससे जुड़ी गतिविधि शुरू हो जाती है (ऊपर दिए गए उदाहरण में .ui.MyActivity
). इसके बाद, आपको अपने कोड और यूज़र इंटरफ़ेस (यूआई) में कॉन्टेंट को सही तरीके से मैनेज करना होगा.
आने वाले कॉन्टेंट को मैनेज करना
Intent
से डिलीवर किए गए कॉन्टेंट को मैनेज करने के लिए, Intent
ऑब्जेक्ट पाने के लिए getIntent()
को कॉल करें. ऑब्जेक्ट मिलने के बाद, इसके कॉन्टेंट की जांच करके यह तय किया जा सकता है कि आगे क्या करना है. अगर इस गतिविधि को सिस्टम के अन्य हिस्सों (जैसे कि लॉन्चर) से शुरू किया जा सकता है, तो इंटेंट की जांच करते समय इस बात का ध्यान रखें.
आने वाले डेटा की जांच करते समय ज़्यादा सावधानी बरतें. आपको कभी नहीं पता चलेगा कि कोई दूसरा ऐप्लिकेशन आपको क्या भेज सकता है. उदाहरण के लिए, हो सकता है कि गलत MIME टाइप सेट किया गया हो या भेजी जा रही इमेज बहुत बड़ी हो. साथ ही, बाइनरी डेटा को मुख्य ("UI") थ्रेड के बजाय किसी अलग थ्रेड में प्रोसेस करना न भूलें.
Kotlin
override fun onCreate(savedInstanceState: Bundle?) { ... when { intent?.action == Intent.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 == Intent.ACTION_SEND_MULTIPLE && 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 to reflect text being shared } } private fun handleSendImage(intent: Intent) { (intent.getParcelableExtra<Parcelable>(Intent.EXTRA_STREAM) as? Uri)?.let { // Update UI to reflect image being shared } } private fun handleSendMultipleImages(intent: Intent) { intent.getParcelableArrayListExtra<Parcelable>(Intent.EXTRA_STREAM)?.let { // Update UI to reflect multiple images being shared } }
Java
void onCreate (Bundle savedInstanceState) { ... // Get intent, action and MIME type Intent intent = getIntent(); String action = intent.getAction(); String type = intent.getType(); if (Intent.ACTION_SEND.equals(action) && type != null) { if ("text/plain".equals(type)) { handleSendText(intent); // Handle text being sent } else if (type.startsWith("image/")) { handleSendImage(intent); // Handle single image being sent } } else if (Intent.ACTION_SEND_MULTIPLE.equals(action) && type != null) { if (type.startsWith("image/")) { handleSendMultipleImages(intent); // Handle multiple images being sent } } else { // Handle other intents, such as being started from the home screen } ... } void handleSendText(Intent intent) { String sharedText = intent.getStringExtra(Intent.EXTRA_TEXT); if (sharedText != null) { // Update UI to reflect text being shared } } void handleSendImage(Intent intent) { Uri imageUri = (Uri) intent.getParcelableExtra(Intent.EXTRA_STREAM); if (imageUri != null) { // Update UI to reflect image being shared } } void handleSendMultipleImages(Intent intent) { ArrayList<Uri> imageUris = intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM); if (imageUris != null) { // Update UI to reflect multiple images being shared } }
डेटा मिलने के बाद यूज़र इंटरफ़ेस (यूआई) को अपडेट करना, EditText
को पॉप्युलेट करने जितना आसान हो सकता है. इसके अलावा, यह किसी इमेज पर दिलचस्प फ़ोटो फ़िल्टर लगाने जैसा ज़्यादा मुश्किल भी हो सकता है. इसके बाद, आपके ऐप्लिकेशन को यह तय करना होता है कि आगे क्या करना है.
पक्का करें कि उपयोगकर्ताओं को आपका ऐप्लिकेशन पता हो
Android की शेयरशीट और इंटेंट रिज़ॉल्वर में, आपके ऐप्लिकेशन को उसके आइकॉन और लेबल से दिखाया जाता है. ये दोनों मेनिफ़ेस्ट में तय किए जाते हैं. ज़्यादा जानकारी देने के लिए, गतिविधि या इंटेंट फ़िल्टर के लेबल सेट किए जा सकते हैं.
Android 10 (एपीआई लेवल 29) से, Android Sharesheet सिर्फ़ उन आइकॉन का इस्तेमाल करता है जिन्हें आपके application
टैग के मेनिफ़ेस्ट में सेट किया गया है. Android, intent-filter
और activity
टैग पर सेट किए गए आइकॉन को अनदेखा करता है.