Android, इंटेंट और उनसे जुड़े एक्स्ट्रा का इस्तेमाल करता है. इससे लोग अपने पसंदीदा ऐप्लिकेशन का इस्तेमाल करके, तुरंत जानकारी शेयर कर पाते हैं.
Android, उपयोगकर्ताओं को ऐप्लिकेशन के बीच डेटा शेयर करने के दो तरीके उपलब्ध कराता है:
- Android Sharesheet को मुख्य रूप से, आपके ऐप्लिकेशन से बाहर कॉन्टेंट भेजने और/या सीधे किसी दूसरे उपयोगकर्ता को कॉन्टेंट भेजने के लिए डिज़ाइन किया गया है. उदाहरण के लिए, किसी दोस्त के साथ यूआरएल शेयर करना.
- Android इंटेंट रिज़ॉल्वर, अच्छी तरह से तय किए गए टास्क के अगले चरण में डेटा पास करने के लिए सबसे सही है. उदाहरण के लिए, आपके ऐप्लिकेशन से PDF फ़ाइल खोलना और उपयोगकर्ताओं को अपनी पसंद का व्यूअर चुनने की अनुमति देना.
इंटेंट बनाते समय, यह तय किया जाता है कि इंटेंट को कौनसी कार्रवाई करनी है.
Android, एक गतिविधि से दूसरी गतिविधि में डेटा भेजने के लिए ACTION_SEND ऐक्शन का इस्तेमाल करता है. भले ही, प्रोसेस की सीमाएं अलग-अलग हों. आपको डेटा और उसके टाइप के बारे में बताना होगा. सिस्टम, डेटा पाने वाली गतिविधियों की पहचान अपने-आप करता है. साथ ही, उन्हें उपयोगकर्ता को दिखाता है. इंटेंट रिज़ॉल्वर के मामले में, अगर सिर्फ़ एक गतिविधि इंटेंट को हैंडल कर सकती है, तो वह गतिविधि तुरंत शुरू हो जाती है.
Android शेयरशीट का इस्तेमाल क्यों करें
हमारा सुझाव है कि आप Android Sharesheet का इस्तेमाल करें, ताकि आपके उपयोगकर्ताओं को सभी ऐप्लिकेशन पर एक जैसा अनुभव मिल सके. अपने ऐप्लिकेशन के शेयर टारगेट की सूची न दिखाएं या शेयरशीट के अलग-अलग वर्शन न बनाएं.
Android की शेयरशीट की मदद से, उपयोगकर्ता एक टैप में सही व्यक्ति के साथ जानकारी शेयर कर सकते हैं. साथ ही, उन्हें काम के सुझाए गए ऐप्लिकेशन भी मिलते हैं. शेयरशीट, कस्टम समाधानों के लिए उपलब्ध नहीं टारगेट का सुझाव दे सकती है. साथ ही, यह एक जैसी रैंकिंग का इस्तेमाल करती है. ऐसा इसलिए है, क्योंकि शेयरशीट, ऐप्लिकेशन और उपयोगकर्ता गतिविधि की जानकारी को ध्यान में रख सकती है. यह जानकारी सिर्फ़ सिस्टम के लिए उपलब्ध होती है.
Android की शेयरशीट में, डेवलपर के लिए कई काम की सुविधाएं भी होती हैं. उदाहरण के लिए, ये काम किए जा सकते हैं:
- जानें कि आपके उपयोगकर्ता कब और कहां शेयर करते हैं
- कस्टम
ChooserTargetऔर ऐप्लिकेशन टारगेट जोड़ना - Android 10 (एपीआई लेवल 29) से शुरू होने वाले वर्शन में, रिच टेक्स्ट कॉन्टेंट की झलक दिखाना
- खास कॉम्पोनेंट के नामों से मेल खाने वाले टारगेट को बाहर रखना
Android शेयरशीट का इस्तेमाल करना
शेयर करने के सभी टाइप के लिए, एक इंटेंट बनाएं और उसके ऐक्शन को Intent.ACTION_SEND पर सेट करें.
Android Sharesheet दिखाने के लिए, Intent.createChooser() को कॉल करें और इसमें अपना Intent ऑब्जेक्ट पास करें.
यह आपके इंटेंट का ऐसा वर्शन दिखाता है जिसमें हमेशा Android Sharesheet दिखती है.
टेक्स्ट कॉन्टेंट भेजना
Android Sharesheet का सबसे आसान और सामान्य इस्तेमाल, टेक्स्ट कॉन्टेंट को एक ऐक्टिविटी से दूसरी ऐक्टिविटी में भेजने के लिए किया जाता है. उदाहरण के लिए, ज़्यादातर ब्राउज़र, फ़िलहाल दिख रहे पेज के यूआरएल को टेक्स्ट के तौर पर किसी दूसरे ऐप्लिकेशन के साथ शेयर कर सकते हैं. यह सुविधा, किसी लेख या वेबसाइट को ईमेल या सोशल नेटवर्किंग के ज़रिए दोस्तों के साथ शेयर करने के लिए काम की है. यहां इसका एक उदाहरण दिया गया है:
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देखें.MediaStoreमें फ़ाइलें डालने के लिए,scanFile()का इस्तेमाल किया जा सकता है. इसके बाद, शेयर करने के लिए सहीcontent://-स्टाइल वालाUri, दिए गएonScanCompleted()कॉलबैक को पास किया जाता है. ध्यान दें कि सिस्टमMediaStoreमें जोड़ने के बाद, डिवाइस पर मौजूद किसी भी ऐप्लिकेशन से कॉन्टेंट को ऐक्सेस किया जा सकता है.
सही एमआईएमई टाइप का इस्तेमाल करना
भेजे जा रहे डेटा के लिए, सबसे सटीक एमआईएमई टाइप दें. उदाहरण के लिए, सामान्य टेक्स्ट शेयर करते समय text/plain का इस्तेमाल करें. Android में डेटा भेजते समय, यहां कुछ सामान्य एमआईएमई टाइप दिए गए हैं:
| ईमेल पाने वाले लोग इसके लिए रजिस्टर करते हैं | ईमेल भेजने वाले लोग |
|---|---|
text/* |
|
`image/*` |
|
video/* |
|
| इस्तेमाल किए जा सकने वाले फ़ाइल एक्सटेंशन | application/pdf |
MIME टाइप के बारे में ज़्यादा जानकारी के लिए, IANA की आधिकारिक रजिस्ट्री देखें.
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 की शेयरशीट पर कस्टम कार्रवाइयों का स्क्रीनशॉट.
Android 14 (एपीआई लेवल 34) और इसके बाद के वर्शन पर, ऐप्लिकेशन Android की शेयरशीट में कस्टम ऐक्शन जोड़ सकते हैं.
कस्टम कार्रवाइयां, Android की शेयरशीट में सबसे ऊपर छोटे ऐक्शन आइकॉन के तौर पर दिखती हैं. साथ ही, ऐप्लिकेशन यह तय कर सकते हैं कि आइकॉन पर क्लिक करने पर कौनसी Intent कार्रवाई शुरू होगी.
Android की शेयरशीट पर कस्टम कार्रवाइयां जोड़ने के लिए, सबसे पहले ChooserAction बनाएं. इसके लिए, ChooserAction.Builder का इस्तेमाल करें.
आइकॉन पर क्लिक करने पर, 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 की शेयरशीट में, ज़्यादा से ज़्यादा दो ChooserTarget ऑब्जेक्ट तय किए जा सकते हैं. ये ऑब्जेक्ट, ChooserTargetServices से लोड किए गए शेयरिंग शॉर्टकट और चूज़र टारगेट से पहले दिखते हैं. ऐप्लिकेशन के सुझावों से पहले, सूची में दी गई गतिविधियों की ओर इशारा करने वाले ज़्यादा से ज़्यादा दो इंटेंट भी तय किए जा सकते हैं:
Intent.createChooser() को कॉल करने के बाद, शेयर करने के इंटेंट में Intent.EXTRA_CHOOSER_TARGETS और Intent.EXTRA_INITIAL_INTENTS जोड़ें:
val share = Intent.createChooser(shareIntent, null).apply { putExtra( Intent.EXTRA_CHOOSER_TARGETS, arrayOf(chooserTargetJessica, chooserTargetSpyros) ) putExtra( Intent.EXTRA_INITIAL_INTENTS, arrayOf(intentTargetNearbyShare, intentTargetMaps) ) }
इस सुविधा का इस्तेमाल सावधानी से करें. हर कस्टम Intent
और ChooserTarget जोड़ने पर, सिस्टम की ओर से सुझाए गए नंबर कम हो जाते हैं. हम आम तौर पर, कस्टम टारगेट जोड़ने का सुझाव नहीं देते. Intent.EXTRA_INITIAL_INTENTS जोड़ने का एक सामान्य और सही उदाहरण यह है कि शेयर किए गए कॉन्टेंट पर, उपयोगकर्ताओं को अतिरिक्त कार्रवाइयां करने की सुविधा दी जाए. उदाहरण के लिए, कोई उपयोगकर्ता इमेज शेयर करता है और Intent.EXTRA_INITIAL_INTENTS का इस्तेमाल करके, उसे इमेज के बजाय लिंक भेजने का विकल्प दिया जाता है. Intent.EXTRA_CHOOSER_TARGETS जोड़ने का एक सामान्य और सही उदाहरण यह है कि इससे उन लोगों या डिवाइसों को दिखाया जा सकता है जिनके लिए आपका ऐप्लिकेशन उपलब्ध है.
कॉम्पोनेंट के हिसाब से कुछ टारगेट को बाहर रखना
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 देना होगा. यह 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 14 (एपीआई लेवल 34) और इसके बाद के वर्शन पर, ऐप्लिकेशन Android की शेयरशीट में कस्टम ऐक्शन जोड़ सकते हैं.
ChooserAction.Builder की मदद से ChooserAction बनाएँ.
आइकॉन पर क्लिक करने पर, PendingIntent को कार्रवाई के तौर पर सेट किया जा सकता है. अपनी सभी कस्टम कार्रवाइयों को शामिल करके एक ऐरे बनाएं और उसे शेयर Intent के EXTRA_CHOOSER_CUSTOM_ACTIONS के तौर पर तय करें.
fun customActions(context: Context, text: String) { val sendIntent = Intent(ACTION_SEND) .setType("text/plain") .putExtra(Intent.EXTRA_TEXT, text) 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 इंटेंट रिज़ॉल्वर का इस्तेमाल करना
ACTION_SEND इंटेंट रिज़ॉल्वर का स्क्रीनशॉट.
Android इंटेंट रिज़ॉल्वर का सबसे अच्छा इस्तेमाल तब होता है, जब किसी टास्क फ़्लो के हिस्से के तौर पर, डेटा को किसी दूसरे ऐप्लिकेशन पर भेजा जाता है.
Android इंटेंट रिज़ॉल्वर का इस्तेमाल करने के लिए, एक इंटेंट बनाएं और उसमें एक्सट्रा जोड़ें. ऐसा ही Android Sharesheet को कॉल करने के लिए किया जाता है. हालांकि, कॉल न करें Intent.createChooser().
अगर फ़िल्टर और MIME टाइप से मेल खाने वाले कई ऐप्लिकेशन इंस्टॉल किए गए हैं, तो सिस्टम एक डायलॉग दिखाता है. इसे इंटेंट रिज़ॉल्वर कहा जाता है. इससे उपयोगकर्ता को शेयर करने के लिए कोई ऐप्लिकेशन चुनने का विकल्प मिलता है.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) }
ज़्यादा जानें
डेटा भेजने के बारे में ज़्यादा जानने के लिए, इंटेंट और इंटेंट फ़िल्टर देखें.