Android, उपयोगकर्ताओं को ऐप्लिकेशन के बीच डेटा शेयर करने के दो तरीके उपलब्ध कराता है:
- Android शेयरशीट को मुख्य रूप से, आपके ऐप्लिकेशन से बाहर या सीधे तौर पर किसी दूसरे उपयोगकर्ता को कॉन्टेंट भेजने के लिए डिज़ाइन किया गया है. उदाहरण के लिए, किसी दोस्त के साथ यूआरएल शेयर करना.
- Android इंटेंट रिज़ॉल्वर, किसी टास्क के अगले चरण में डेटा भेजने के लिए सबसे सही है. उदाहरण के लिए, आपके ऐप्लिकेशन से PDF खोलना और उपयोगकर्ताओं को अपनी पसंद का व्यूअर चुनने की सुविधा देना.
Android शेयरशीट का इस्तेमाल क्यों करना चाहिए
Android शेयरशीट का इस्तेमाल करके, अपने उपयोगकर्ताओं को सभी ऐप्लिकेशन पर एक जैसा अनुभव दें. अपने ऐप्लिकेशन में शेयर करने के लिए टारगेट की सूची न दिखाएं या शेयरशीट के अपने वर्शन न बनाएं.
Android शेयरशीट की मदद से, उपयोगकर्ता सिर्फ़ एक टैप करके, सही व्यक्ति के साथ जानकारी शेयर कर सकते हैं. साथ ही, उन्हें काम के ऐप्लिकेशन के सुझाव भी मिलते हैं. शेयरशीट, कस्टम सलूशन के लिए उपलब्ध न होने वाले टारगेट का सुझाव दे सकती है. साथ ही, यह एक जैसी रैंकिंग का इस्तेमाल करती है. ऐसा इसलिए है, क्योंकि शेयरशीट में ऐप्लिकेशन और उपयोगकर्ता गतिविधि की जानकारी शामिल हो सकती है. यह जानकारी सिर्फ़ सिस्टम के पास होती है.
Android शेयरशीट में, डेवलपर के लिए कई काम की सुविधाएं भी मौजूद हैं. उदाहरण के लिए, ये काम किए जा सकते हैं:
- यह पता लगाना कि आपके उपयोगकर्ता कब और कहां कॉन्टेंट शेयर करते हैं
- कस्टम टारगेट और ऐप्लिकेशन टारगेट जोड़ना
- Android 10 (एपीआई लेवल 29) से, रिच टेक्स्ट कॉन्टेंट की झलक दिखाना
- किसी कॉम्पोनेंट के नाम से मैच करने वाले टारगेट को बाहर रखना
Android शेयरशीट का इस्तेमाल करना
सभी तरह के शेयर करने के लिए, एक इंटेंट बनाएं और उसकी कार्रवाई को Intent.ACTION_SEND पर सेट करें.
Android शेयरशीट दिखाने के लिए, Intent.createChooser() को कॉल करें.
इसके बाद, इसे अपना Intent ऑब्जेक्ट पास करें.
यह आपके इंटेंट का ऐसा वर्शन दिखाता है जो हमेशा Android शेयरशीट दिखाता है.
टेक्स्ट कॉन्टेंट भेजना
Android शेयरशीट का सबसे आसान और आम इस्तेमाल, टेक्स्ट कॉन्टेंट को एक ऐक्टिविटी से दूसरी ऐक्टिविटी में भेजना है. उदाहरण के लिए, ज़्यादातर ब्राउज़र, मौजूदा पेज के यूआरएल को टेक्स्ट के तौर पर किसी दूसरे ऐप्लिकेशन के साथ शेयर कर सकते हैं. यह सुविधा, ईमेल या सोशल नेटवर्किंग के ज़रिए दोस्तों के साथ कोई लेख या वेबसाइट शेयर करने के लिए काम की है. Jetpack Compose में, LocalContext.current का इस्तेमाल करके मौजूदा कॉन्टेक्स्ट को वापस पाएं और context.startActivity() को कॉल करें.
यहां ऐसा करने का उदाहरण दिया गया है:
fun shareText(context: Context) { val sendIntent: Intent = Intent().apply { action = ACTION_SEND putExtra(Intent.EXTRA_TEXT, "This is my text to send.") type = "text/plain" } val shareIntent = Intent.createChooser(sendIntent, null) context.startActivity(shareIntent) }
इसके अलावा, ज़्यादा जानकारी शामिल करने के लिए, अतिरिक्त जानकारी जोड़ी जा सकती है. जैसे, ईमेल पाने वाले लोग
(EXTRA_EMAIL,
EXTRA_CC,
EXTRA_BCC)
या ईमेल का विषय
(EXTRA_SUBJECT).
ध्यान दें: Gmail जैसे कुछ ईमेल ऐप्लिकेशन, EXTRA_EMAIL और EXTRA_CC जैसी अतिरिक्त जानकारी के लिए, String[] की उम्मीद करते हैं. इन्हें अपने इंटेंट में जोड़ने के लिए,
putExtra(String, String[])
का इस्तेमाल करें.
बाइनरी कॉन्टेंट भेजना
ACTION_SEND कार्रवाई का इस्तेमाल करके, बाइनरी डेटा शेयर करें.
सही एमआईएमई टाइप सेट करें और डेटा के यूआरआई को अतिरिक्त EXTRA_STREAM में डालें, जैसा कि यहां दिए गए उदाहरण में दिखाया गया है.
आम तौर पर, इसका इस्तेमाल इमेज शेयर करने के लिए किया जाता है. हालांकि, इसका इस्तेमाल किसी भी तरह का बाइनरी कॉन्टेंट शेयर करने के लिए किया जा सकता है.
fun shareBinaryContent(context: Context) { val shareIntent: Intent = Intent().apply { action = ACTION_SEND // Example: content://com.google.android.apps.photos.contentprovider/... val imageUri: Uri = Uri.parse("content://com.google.android.apps.photos.contentprovider/0/1/mediakey/1") putExtra(Intent.EXTRA_STREAM, imageUri) type = "image/jpeg" } context.startActivity(Intent.createChooser(shareIntent, null)) }
डेटा पाने वाले ऐप्लिकेशन को उस डेटा को ऐक्सेस करने की अनुमति चाहिए जिस पर Uri
पॉइंट करता है. ऐसा करने के लिए, ये दो तरीके सुझाए गए हैं:
- डेटा को अपने
ContentProviderमें सेव करें. साथ ही, पक्का करें कि अन्य ऐप्लिकेशन के पास आपके प्रोवाइडर को ऐक्सेस करने की सही अनुमति हो. ऐक्सेस देने के लिए, हर यूआरआई के लिए अनुमतियों का इस्तेमाल करना सबसे सही तरीका है. ये अनुमतियां कुछ समय के लिए होती हैं और सिर्फ़ डेटा पाने वाले ऐप्लिकेशन को ऐक्सेस देती हैं. इस तरह काContentProviderबनाने के लिए,FileProviderहेल्पर क्लास का इस्तेमाल करें. - सिस्टम
MediaStoreका इस्तेमाल करें.MediaStoreका इस्तेमाल मुख्य तौर पर वीडियो, ऑडियो, और इमेज के एमआईएमई टाइप के लिए किया जाता है. हालांकि, Android 3.0 (एपीआई लेवल 11) से, इसमें नॉन-मीडिया टाइप भी सेव किए जा सकते हैं. ज़्यादा जानकारी के लिए,MediaStore.Filesदेखें.scanFile()का इस्तेमाल करके, फ़ाइलों कोMediaStoreमें डाला जा सकता है. इसके बाद, शेयर करने के लिए सहीcontent://-स्टाइलUriको दिए गएonScanCompleted()कॉलबैक में पास किया जाता है. ध्यान दें कि सिस्टमMediaStoreमें जोड़े जाने के बाद, कॉन्टेंट को डिवाइस पर मौजूद किसी भी ऐप्लिकेशन से ऐक्सेस किया जा सकता है.
सही एमआईएमई टाइप का इस्तेमाल करना
भेजे जा रहे डेटा के लिए, उपलब्ध सबसे सटीक एमआईएमई टाइप दें. उदाहरण के लिए, सादा टेक्स्ट शेयर करते समय text/plain का इस्तेमाल करें. Android में डेटा भेजते समय, आम तौर पर इस्तेमाल होने वाले कुछ एमआईएमई टाइप यहां दिए गए हैं:
| ईमेल पाने वाले लोग, इसके लिए रजिस्टर करते हैं | ईमेल भेजने वाले लोग, ईमेल भेजते हैं |
|---|---|
text/* |
|
image/* |
|
video/* |
|
| इस्तेमाल किए जा सकने वाले फ़ाइल एक्सटेंशन | application/pdf |
रनटाइम के दौरान एमआईएमई टाइप को हार्डकोड करने के बजाय, डाइनैमिक तरीके से तय करने के लिए, ये तरीके अपनाएं:
content://यूआरआई (जैसे,FileProviderयाMediaStoreसे मिले यूआरआई) के लिए,ContentResolver.getType()को कॉल करें.- फ़ाइल एक्सटेंशन के लिए,
MimeTypeMap.getSingleton().getMimeTypeFromExtension()को कॉल करें. - अगर स्टोरेज ऐक्सेस फ़्रेमवर्क का इस्तेमाल किया जाता है, तो
DocumentFile.getType()के लिए भी क्वेरी की जा सकती है.
अगर आपको किसी खास एमआईएमई टाइप का पता नहीं चल पा रहा है, तो सामान्य बाइनरी डेटा के लिए application/octet-stream का इस्तेमाल करें. इसके अलावा, आखिरी विकल्प के तौर पर */* का इस्तेमाल करें.
एमआईएमई टाइप के बारे में ज़्यादा जानकारी के लिए, एमआईएमई मीडिया टाइप की आधिकारिक रजिस्ट्री, आईएएनए देखें.
Android शेयरशीट, कॉन्टेंट की झलक दिखा सकती है. यह झलक, दिए गए एमआईएमई टाइप के आधार पर दिखती है. झलक के तौर पर उपलब्ध कुछ सुविधाएं, सिर्फ़ कुछ खास तरह के कैंपेन के लिए उपलब्ध हैं.
एक से ज़्यादा कॉन्टेंट शेयर करना
एक से ज़्यादा कॉन्टेंट शेयर करने के लिए, ACTION_SEND_MULTIPLE कार्रवाई का इस्तेमाल करें. साथ ही, कॉन्टेंट पर ले जाने वाले यूआरआई की सूची भी दें. एमआईएमई टाइप, शेयर किए जा रहे कॉन्टेंट के हिसाब से अलग-अलग होता है. उदाहरण के लिए, अगर आपको तीन JPEG इमेज शेयर करनी हैं, तो "image/jpg" टाइप का इस्तेमाल करें. अलग-अलग तरह की इमेज के लिए, "image/*" का इस्तेमाल करें. इससे ऐसी गतिविधि को मैच किया जा सकता है जो किसी भी तरह की इमेज को हैंडल करती है. हालांकि, अलग-अलग तरह के कॉन्टेंट को एक साथ शेयर किया जा सकता है, लेकिन ऐसा करने से बचें. ऐसा इसलिए, क्योंकि इससे कॉन्टेंट पाने वाले व्यक्ति को यह समझने में मुश्किल हो सकती है कि उसे क्या भेजा गया है. अगर एक से ज़्यादा टाइप भेजना ज़रूरी है, तो "*/*" का इस्तेमाल करें. डेटा पाने वाला ऐप्लिकेशन, आपके डेटा को पार्स और प्रोसेस करता है. यहां एक उदाहरण दिया गया है:
fun shareMultiple(context: Context) { val imageUris: ArrayList<Uri> = arrayListOf( Uri.parse("content://com.google.android.apps.photos.contentprovider/0/1/mediakey/1"), Uri.parse("content://com.google.android.apps.photos.contentprovider/0/1/mediakey/2") ) val shareIntent = Intent().apply { action = Intent.ACTION_SEND_MULTIPLE putParcelableArrayListExtra(Intent.EXTRA_STREAM, imageUris) type = "image/*" } context.startActivity(Intent.createChooser(shareIntent, null)) }
पक्का करें कि दिए गए Uri ऑब्जेक्ट, उस डेटा पर ले जाएं जिसे डेटा पाने वाला ऐप्लिकेशन ऐक्सेस कर सकता है.
टेक्स्ट की झलक में रिच कॉन्टेंट जोड़ना
Android 10 (एपीआई लेवल 29) से, Android शेयरशीट में शेयर किए जा रहे टेक्स्ट की झलक दिखती है. कुछ मामलों में, शेयर किए जा रहे टेक्स्ट को समझना मुश्किल हो सकता है. https://www.google.com/search?ei=2rRVXcLkJajM0PEPoLy7oA4 जैसे किसी मुश्किल यूआरएल को शेयर करने के बारे में सोचें. ज़्यादा जानकारी वाला प्रीव्यू, आपके उपयोगकर्ताओं को यह भरोसा दिला सकता है कि क्या शेयर किया जा रहा है.
टेक्स्ट की झलक देखते समय, टाइटल, थंबनेल इमेज या दोनों को सेट किया जा सकता है. Intent.createChooser() को कॉल करने से पहले, Intent.EXTRA_TITLE में ब्यौरा जोड़ें. साथ ही, ClipData का इस्तेमाल करके काम का थंबनेल जोड़ें.
ध्यान दें: इमेज कॉन्टेंट यूआरआई, FileProvider से मिलता है. आम तौर पर, यह कॉन्फ़िगर किए गए <cache-path> से मिलता है.
ज़्यादा जानकारी के लिए, फ़ाइलें शेयर करना लेख पढ़ें. शेयरशीट को ज़रूरी अनुमतियां दें, ताकि वह उस इमेज को ऐक्सेस कर सके जिसे आपको थंबनेल के तौर पर इस्तेमाल करना है. ज़्यादा जानकारी के लिए, Intent.FLAG_GRANT_READ_URI_PERMISSION देखें.
यहां एक उदाहरण दिया गया है:
fun richContentToTextPreviewShares(context: Context) { val share = Intent.createChooser( Intent().apply { action = ACTION_SEND putExtra(Intent.EXTRA_TEXT, "https://developer.android.com/training/sharing/") // (Optional) Here you're setting the title of the content putExtra(Intent.EXTRA_TITLE, "Introducing content previews") // (Optional) Here you're passing a content URI to an image to be displayed data = Uri.parse("content://com.google.android.apps.photos.contentprovider/0/1/mediakey/A123456789") flags = Intent.FLAG_GRANT_READ_URI_PERMISSION }, null ) context.startActivity(share) }
झलक कुछ इस तरह दिखती है:
शेयरशीट में कस्टम ऐक्शन जोड़ना
Android 14 (एपीआई लेवल 34) और इसके बाद के वर्शन पर, ऐप्लिकेशन Android शेयरशीट में कस्टम कार्रवाइयां जोड़ सकते हैं.
कस्टम ऐक्शन, Android शेयरशीट में सबसे ऊपर छोटे ऐक्शन आइकॉन के तौर पर दिखते हैं. साथ ही, ऐप्लिकेशन किसी भी Intent को उस ऐक्शन के तौर पर तय कर सकते हैं जो आइकॉन पर क्लिक करने पर ट्रिगर होता है.
Android शेयरशीट पर कस्टम ऐक्शन जोड़ने के लिए, पहले ChooserAction.Builder की मदद से ChooserAction बनाएं.
आइकॉन पर क्लिक करने पर, PendingIntent को ट्रिगर होने वाली कार्रवाई के तौर पर सेट किया जा सकता है. एक ऐसा कलेक्शन बनाएं जिसमें आपके सभी कस्टम ऐक्शन शामिल हों. साथ ही, इसे शेयर Intent के EXTRA_CHOOSER_CUSTOM_ACTIONS के तौर पर तय करें.
fun sharesheetCustomActions(context: Context, previewText: String) { val sendIntent = Intent(ACTION_SEND) .setType("text/plain") .putExtra(Intent.EXTRA_TEXT, previewText) val shareIntent = Intent.createChooser(sendIntent, null) val customActions = arrayOf( ChooserAction.Builder( Icon.createWithResource(context, R.drawable.ic_logo), "Custom", PendingIntent.getBroadcast( context, 1, Intent(Intent.ACTION_VIEW), PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_CANCEL_CURRENT ) ).build() ) shareIntent.putExtra(Intent.EXTRA_CHOOSER_CUSTOM_ACTIONS, customActions) context.startActivity(shareIntent) }
कस्टम टारगेट जोड़ना
Android शेयरशीट की मदद से, ज़्यादा से ज़्यादा दो कस्टम गतिविधि इंटेंट तय किए जा सकते हैं. ये इंटेंट, Intent.EXTRA_INITIAL_INTENTS का इस्तेमाल करके ऐप्लिकेशन के सुझावों से पहले दिखते हैं.
डायरेक्ट शेयर टारगेट (जैसे, बातचीत या संपर्क) के लिए, डाइनैमिक शॉर्टकट पब्लिश करें. इसके लिए, ShortcutManagerCompat का इस्तेमाल करें (डायरेक्ट शेयर टारगेट उपलब्ध कराएं देखें):
Intent.createChooser() को कॉल करने के बाद, अपने शेयर इंटेंट में Intent.EXTRA_INITIAL_INTENTS जोड़ें:
val sendIntent = Intent(ACTION_SEND).apply { type = "text/plain" putExtra(Intent.EXTRA_TEXT, previewText) } val customIntent = Intent().apply { component = ComponentName(context.packageName, "${context.packageName}.CustomActivity") } val shareIntent = Intent.createChooser(sendIntent, null).apply { putExtra( Intent.EXTRA_INITIAL_INTENTS, arrayOf(customIntent) ) } context.startActivity(shareIntent)
इस सुविधा का इस्तेमाल सावधानी से करें. हर कस्टम Intent
जोड़ने पर, सिस्टम से सुझाए गए कीवर्ड की संख्या कम हो जाती है. आम तौर पर, कस्टम टारगेट
जोड़ने से बचें. Intent.EXTRA_INITIAL_INTENTS जोड़ने का एक सामान्य उदाहरण यह है कि शेयर किए गए कॉन्टेंट पर, उपयोगकर्ताओं को अतिरिक्त कार्रवाइयां करने की सुविधा दी जाए. उदाहरण के लिए, कोई उपयोगकर्ता इमेज शेयर करता है और Intent.EXTRA_INITIAL_INTENTS का इस्तेमाल करके, उसे इमेज के बजाय लिंक भेजने की सुविधा दी जाती है.
कॉम्पोनेंट के हिसाब से कुछ टारगेट को बाहर रखना
Intent.EXTRA_EXCLUDE_COMPONENTS देकर, कुछ खास टारगेट को बाहर रखा जा सकता है.
सिर्फ़ उन टारगेट को हटाने के लिए ऐसा करें जिन पर आपका कंट्रोल है. आम तौर पर, जब उपयोगकर्ता आपके ऐप्लिकेशन से कॉन्टेंट शेयर करते हैं, तो आपके ऐप्लिकेशन के शेयर टारगेट छिपा दिए जाते हैं. ऐसा इसलिए, क्योंकि उपयोगकर्ता आपके ऐप्लिकेशन से बाहर कॉन्टेंट शेयर करना चाहते हैं.
Intent.createChooser() को कॉल करने के बाद, अपने इंटेंट में Intent.EXTRA_EXCLUDE_COMPONENTS जोड़ें:
fun excludeSpecificTargets(context: Context) { val share = Intent.createChooser(Intent(ACTION_SEND), null).apply { // Only use for components you have control over val excludedComponentNames = arrayOf(ComponentName("com.example.android", "ExampleClass")) putExtra(Intent.EXTRA_EXCLUDE_COMPONENTS, excludedComponentNames) } context.startActivity(share) }
शेयर करने के बारे में जानकारी पाना
यह जानना मददगार हो सकता है कि आपके उपयोगकर्ता कब शेयर कर रहे हैं और वे कौनसा टारगेट चुनते हैं. Android शेयरशीट की मदद से, यह जानकारी हासिल की जा सकती है. इसके लिए, आपको उन टारगेट का ComponentName देना होगा जिन्हें आपके उपयोगकर्ता IntentSender का इस्तेमाल करके चुनते हैं.
सबसे पहले, BroadcastReceiver के लिए PendingIntent बनाएं और Intent.createChooser() में इसका IntentSender दें:
fun infoAboutSharing(context: Context, requestCode: Int) { var share = Intent(ACTION_SEND) // ... val pi = PendingIntent.getBroadcast( context, requestCode, Intent(context, ShareBroadcastReceiver::class.java), PendingIntent.FLAG_MUTABLE or PendingIntent.FLAG_UPDATE_CURRENT ) share = Intent.createChooser(share, null, pi.intentSender) context.startActivity(share) }
MyBroadcastReceiver में कॉलबैक पाएं और Intent.EXTRA_CHOOSER_RESULT में देखें:
override fun onReceive(context: Context?, intent: Intent) { val TAG = ShareBroadcastReceiver::class.simpleName val chooserResult: ChooserResult? = IntentCompat.getParcelableExtra( intent, Intent.EXTRA_CHOOSER_RESULT, ChooserResult::class.java, ) chooserResult?.let { Log.i(TAG, "Share callback: isShortcut: ${it.isShortcut}, type: ${typeToString(it.type)}, componentName: ${it.selectedComponent}", ) } ?: Log.i(TAG, "chooserResult is null") }
ज़्यादा जानकारी के लिए, प्लैटफ़ॉर्म के साथ रेवेन्यू के बंटवारे का सैंपल देखें.
Android इंटेंट रिज़ॉल्वर का इस्तेमाल करना
ACTION_SEND इंटेंट रिज़ॉल्वर.Android इंटेंट रिज़ॉल्वर का इस्तेमाल तब सबसे सही होता है, जब किसी टास्क फ़्लो के तहत किसी दूसरे ऐप्लिकेशन को डेटा भेजा जाता है.
Android इंटेंट रिज़ॉल्वर का इस्तेमाल करने के लिए, एक इंटेंट बनाएं और उसमें अतिरिक्त जानकारी जोड़ें. ठीक उसी तरह जैसे Android शेयरशीट को कॉल करने के लिए किया जाता है. हालांकि, Intent.createChooser() पर कॉल न करें.
अगर इंस्टॉल किए गए कई ऐप्लिकेशन में ऐसे फ़िल्टर हैं जो
ACTION_SEND
और एमआईएमई टाइप से मैच करते हैं, तो सिस्टम एक डायलॉग बॉक्स दिखाता है. इसे इंटेंट रिज़ॉल्वर कहा जाता है.
इसकी मदद से, उपयोगकर्ता यह चुन सकता है कि उसे कॉन्टेंट कहां शेयर करना है. अगर कोई एक ऐप्लिकेशन
मैच करता है, तो वह चलता है.
यहां Android इंटेंट रिज़ॉल्वर का इस्तेमाल करके टेक्स्ट भेजने का उदाहरण दिया गया है:
fun intentResolver(context: Context) { val sendIntent: Intent = Intent().apply { action = ACTION_SEND putExtra(Intent.EXTRA_TEXT, "This is my text to send.") type = "text/plain" } context.startActivity(sendIntent) }
ज़्यादा जानें
डेटा भेजने के बारे में ज़्यादा जानकारी के लिए, इंटेंट और इंटेंट फ़िल्टर देखें.