जिस तरह कोई ऐप्लिकेशन, दूसरे ऐप्लिकेशन को डेटा भेज सकता है उसी तरह उसे दूसरे ऐप्लिकेशन से भी डेटा मिल सकता है. इस बारे में सोचें कि उपयोगकर्ता आपके ऐप्लिकेशन से कैसे इंटरैक्ट करते हैं और आपको दूसरे ऐप्लिकेशन से किस तरह का डेटा चाहिए. उदाहरण के लिए, हो सकता है कि किसी सोशल नेटवर्किंग ऐप्लिकेशन को किसी दूसरे ऐप्लिकेशन से दिलचस्प वेब यूआरएल जैसा टेक्स्ट कॉन्टेंट चाहिए हो.
अन्य ऐप्लिकेशन के उपयोगकर्ता, Android Sharesheet या इंटेंट रिज़ॉल्वर की मदद से, आपके ऐप्लिकेशन में अक्सर डेटा भेजते हैं. आपके ऐप्लिकेशन को डेटा भेजने वाले ऐप्लिकेशन को उस डेटा के लिए एमआईएम टाइप सेट करना होगा. आपके ऐप्लिकेशन को किसी दूसरे ऐप्लिकेशन से भेजा गया डेटा, इन तरीकों से मिल सकता है:
- मेनिफ़ेस्ट में, मिलते-जुलते
intent-filter
टैग वालाActivity
- आपके ऐप्लिकेशन से पब्लिश किए गए शॉर्टकट शेयर करना.
सीधे शेयर करने के टारगेट, आपके ऐप्लिकेशन में किसी खास गतिविधि के डीप लिंक होते हैं. अक्सर, ये किसी व्यक्ति या ग्रुप को दिखाते हैं. साथ ही, Android शेयरशीट में इन्हें दिखाया जाता है. उदाहरण के लिए, कोई मैसेजिंग ऐप्लिकेशन किसी व्यक्ति के लिए डायरेक्ट शेयर टारगेट उपलब्ध करा सकता है. यह टारगेट, उस व्यक्ति के साथ सीधे तौर पर बातचीत करने के लिए डीप लिंक करता है. ज़्यादा जानकारी के लिए, डायरेक्ट शेयर के टारगेट उपलब्ध कराना लेख पढ़ें.
काम करने वाले MIME टाइप
आम तौर पर, किसी ऐप्लिकेशन को ज़्यादा से ज़्यादा MIME टाइप मिलना चाहिए.
उदाहरण के लिए, टेक्स्ट, इमेज, और वीडियो भेजने के लिए डिज़ाइन किया गया मैसेजिंग ऐप्लिकेशन, text/*
, image/*
, और video/*
को पाने के लिए सबसे सही होता है. Android में सामान्य डेटा भेजने और पाने के लिए, यहां कुछ सामान्य एमआईएमई टाइप दिए गए हैं.
ईमेल पाने वाले लोग, | ईमेल भेजने वाले |
---|---|
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 शेयरशीट या इंटेंट रिज़ॉल्वर में एक विकल्प के तौर पर दिखता है. अगर उपयोगकर्ता आपका ऐप्लिकेशन चुनता है, तो इससे उससे जुड़ी ऐक्टिविटी शुरू हो जाती है (पिछले उदाहरण में .ui.MyActivity
). इसके बाद, यह आपके कोड और यूज़र इंटरफ़ेस (यूआई) में कॉन्टेंट को सही तरीके से मैनेज करने का काम है.
आने वाले कॉन्टेंट को मैनेज करना
Intent
से डिलीवर किए गए कॉन्टेंट को मैनेज करने के लिए, Intent
ऑब्जेक्ट पाने के लिए getIntent()
को कॉल करें. ऑब्जेक्ट मिलने के बाद,
इसके कॉन्टेंट की जांच करके यह तय किया जा सकता है कि आगे क्या करना है. अगर इस गतिविधि को सिस्टम के दूसरे हिस्सों (जैसे, लॉन्चर) से शुरू किया जा सकता है, तो इंटेंट की जांच करते समय इस बात का ध्यान रखें.
आने वाले डेटा की जांच करने में ज़्यादा सावधानी बरतें. कभी-कभी कोई दूसरा ऐप्लिकेशन आपको कुछ भी भेज सकता है. उदाहरण के लिए, हो सकता है कि गलत MIME टाइप सेट किया गया हो या भेजी जा रही इमेज का साइज़ बहुत बड़ा हो. साथ ही, मुख्य ("यूज़र इंटरफ़ेस") थ्रेड के बजाय, अलग थ्रेड में बाइनरी डेटा प्रोसेस करना न भूलें.
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 Sharesheet और इंटेंट रिज़ॉल्वर में, आपके ऐप्लिकेशन को उसके आइकॉन और लेबल से दिखाया जाता है. इन दोनों की जानकारी मेनिफ़ेस्ट में दी गई है. ज़्यादा जानकारी देने के लिए, गतिविधि या इंटेंट फ़िल्टर लेबल सेट किए जा सकते हैं.
Android 10 (एपीआई लेवल 29) से, Android शेयरशीट सिर्फ़ आपके application
टैग के मेनिफ़ेस्ट में सेट किए गए आइकॉन का इस्तेमाल करती है. Android, intent-filter
और activity
टैग पर सेट किए गए आइकॉन को अनदेखा करता है.