जिस तरह कोई ऐप्लिकेशन, दूसरे ऐप्लिकेशन को डेटा भेज सकता है उसी तरह वह दूसरे ऐप्लिकेशन से डेटा पा भी सकता है. इस बारे में सोचें कि लोग आपके ऐप्लिकेशन से कैसे इंटरैक्ट करते हैं और आपको दूसरे ऐप्लिकेशन से किस तरह का डेटा चाहिए. उदाहरण के लिए, किसी सोशल नेटवर्किंग ऐप्लिकेशन को दूसरे ऐप्लिकेशन से टेक्स्ट कॉन्टेंट मिल सकता है. जैसे, कोई दिलचस्प वेब यूआरएल.
दूसरे ऐप्लिकेशन के लोग, अक्सर Android Sharesheet या इंटेंट रिज़ॉल्वर के ज़रिए आपके ऐप्लिकेशन को डेटा भेजते हैं. जो ऐप्लिकेशन आपके ऐप्लिकेशन को डेटा भेजते हैं उन्हें उस डेटा के लिए, MIME टाइप सेट करना होगा. आपका ऐप्लिकेशन, दूसरे ऐप्लिकेशन से भेजा गया डेटा इन तरीकों से पा सकता है:
- मेनिफ़ेस्ट में,
intent-filterटैग से मेल खाने वालीActivity - आपके ऐप्लिकेशन से पब्लिश किए गए शेयरिंग शॉर्टकट.
सीधे तौर पर कॉन्टेंट शेयर करने के लिए चुने गए लोग या ग्रुप, आपके ऐप्लिकेशन में मौजूद किसी खास गतिविधि के डीप लिंक होते हैं. ये अक्सर किसी व्यक्ति या ग्रुप को दिखाते हैं. 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 टाइप सेट किया जा सकता है या भेजी जा रही इमेज बहुत बड़ी हो सकती है. इसके अलावा, बाइनरी डेटा को मुख्य ("यूआई") थ्रेड के बजाय, किसी अलग थ्रेड में प्रोसेस करना न भूलें.
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
}
}
डेटा मिलने के बाद, यूज़र इंटरफ़ेस (यूआई) को अपडेट करना, an
EditText को पॉप्युलेट करने जितना आसान हो सकता है. हालांकि, यह किसी इमेज पर दिलचस्प फ़ोटो फ़िल्टर लागू करने जैसा ज़्यादा
मुश्किल भी हो सकता है. यह तय करना आपके ऐप्लिकेशन पर निर्भर करता है कि आगे क्या करना है.
स्क्रीनशॉट का यूआरएल शेयर करना
स्क्रीनशॉट लेने पर, उसे और उससे जुड़े किसी भी यूआरएल को शेयर किया जा सकता है.
इससे लोगों को बेहतर अनुभव मिलता है. यूआरएल पाने पर, पक्का करें कि आपको इंटेंट से EXTRA_TEXT फ़ील्ड मिले. जैसा कि यहां दिए गए उदाहरण में दिखाया गया है:
override fun onCreate(savedInstanceState: Bundle?) {
...
when {
intent?.action == Intent.ACTION_SEND -> {
if (intent.type?.startsWith("image/") == true) {
handleSendImage(intent)
}
}
...
}
private fun handleSendImage(intent: Intent) {
(intent.getParcelableExtra<Parcelable>(Intent.EXTRA_STREAM) as? Uri)?.let {
// Handle the EXTRA_TEXT as well
intent.getCharSequenceExtra(Intent.EXTRA_TEXT)
// Update UI to reflect image being shared and the EXTRA_TEXT
// if available
}
}
...
}
पक्का करें कि लोग आपके ऐप्लिकेशन को पहचानें
Android Sharesheet और इंटेंट रिज़ॉल्वर में, आपका ऐप्लिकेशन उसके आइकॉन और लेबल से दिखता है. ये दोनों, मेनिफ़ेस्ट में तय किए जाते हैं. ज़्यादा जानकारी देने के लिए, गतिविधि या इंटेंट फ़िल्टर के लेबल सेट किए जा सकते हैं.
Android 10 (एपीआई लेवल 29) से, Android Sharesheet सिर्फ़ आपके application टैग पर मेनिफ़ेस्ट में सेट किए गए आइकॉन का इस्तेमाल करता है. Android, intent-filter और activity टैग पर सेट किए गए आइकॉन को नज़रअंदाज़ कर देता है.