उपयोगकर्ताओं को इमेज, वीडियो, और दूसरे तरह के कॉन्टेंट पसंद आते हैं. हालांकि, ऐप्लिकेशन में इस कॉन्टेंट को डालना और एक जगह से दूसरी जगह ले जाना हमेशा आसान नहीं होता. ऐप्लिकेशन को बेहतर कॉन्टेंट पाने में आसानी हो, इसके लिए Android 12 (एपीआई लेवल 31) में एक यूनिफ़ाइड एपीआई जोड़ा गया है. इसकी मदद से, आपका ऐप्लिकेशन क्लिपबोर्ड, कीबोर्ड या खींचकर छोड़ने जैसे किसी भी सोर्स से कॉन्टेंट स्वीकार कर सकता है.
यूज़र इंटरफ़ेस (यूआई) कॉम्पोनेंट में, OnReceiveContentListener
जैसे इंटरफ़ेस को अटैच किया जा सकता है. साथ ही, किसी भी तरीके से कॉन्टेंट डालने पर कॉलबैक पाया जा सकता है. कॉलबैक, आपके कोड के लिए एक ही जगह बन जाता है, जहां वह सारा कॉन्टेंट मैनेज करता है. जैसे, सादा और स्टाइल वाला टेक्स्ट, मार्कअप, इमेज, वीडियो, ऑडियो फ़ाइलें वगैरह.
Android के पुराने वर्शन के साथ काम करने के लिए, यह एपीआई भी AndroidX में उपलब्ध है, जो यहां से शुरू हो रहा है: कोर 1.7 और Appcompat 1.4, हमारा सुझाव है कि इस सुविधा को लागू करते समय, इसका इस्तेमाल करें.
खास जानकारी
अन्य मौजूदा API के साथ, प्रत्येक यूज़र इंटरफ़ेस (यूआई) तंत्र—जैसे कि टच और होल्ड मेन्यू या खींचने और छोड़ने पर—उसका खुद का एपीआई होता है. इसका मतलब है कि आपको हर एपीआई के साथ अलग-अलग इंटिग्रेट करें. साथ ही, हर उस तरीके के लिए एक जैसा कोड जोड़ें जिसमें सामग्री सम्मिलित करता है:
OnReceiveContentListener
एपीआई, इन अलग-अलग कोड पाथ को इसके अनुसार इकट्ठा करता है
सिंगल एपीआई बनाकर उसे लागू किया जा सकता है, ताकि आप ऐप्लिकेशन के खास लॉजिक पर फ़ोकस कर सकें
फिर बाकी काम प्लैटफ़ॉर्म पर छोड़ दें:
इसका मतलब यह भी है कि अगर कॉन्टेंट डालने के नए तरीके तो आपको सहायता केंद्र चालू करने के लिए, कोड में दूसरे बदलाव करने की ज़रूरत नहीं है आपके ऐप्लिकेशन में. अगर आपके ऐप्लिकेशन को इस्तेमाल का उदाहरण देते हैं, तब भी मौजूदा एपीआई का इस्तेमाल किया जा सकता है, जो काम करते रहते हैं उसी तरह.
लागू करना
एपीआई, एक तरीके वाला लिसनर इंटरफ़ेस है,
OnReceiveContentListener
.
Android प्लैटफ़ॉर्म के पुराने वर्शन के साथ काम करने के लिए, हमारा सुझाव है कि आप AndroidX कोर लाइब्रेरी में, मिलते-जुलते OnReceiveContentListener
इंटरफ़ेस का इस्तेमाल करें.
एपीआई का इस्तेमाल करने के लिए, यह बताकर लिसनर लागू करें कि आपका ऐप्लिकेशन किस तरह का कॉन्टेंट मैनेज कर सकता है:
object MyReceiver : OnReceiveContentListener { val MIME_TYPES = arrayOf("image/*", "video/*") // ... override fun onReceiveContent(view: View, payload: ContentInfoCompat): ContentInfoCompat? { TODO("Not yet implemented") } }
public class MyReceiver implements OnReceiveContentListener { public static final String[] MIME_TYPES = new String[] {"image/*", "video/*"}; // ... }
आपके ऐप्लिकेशन में इस्तेमाल होने वाले सभी तरह के कॉन्टेंट MIME टाइप तय करने के बाद, लागू करें बाकी लिसनर:
class MyReceiver : OnReceiveContentListener { override fun onReceiveContent(view: View, contentInfo: ContentInfoCompat): ContentInfoCompat { val split = contentInfo.partition { item: ClipData.Item -> item.uri != null } val uriContent = split.first val remaining = split.second if (uriContent != null) { // App-specific logic to handle the URI(s) in uriContent. } // Return anything that your app didn't handle. This preserves the // default platform behavior for text and anything else that you aren't // implementing custom handling for. return remaining } companion object { val MIME_TYPES = arrayOf("image/*", "video/*") } }
public class MyReceiver implements OnReceiveContentListener { public static final String[] MIME_TYPES = new String[] {"image/*", "video/*"}; @Override public ContentInfoCompat onReceiveContent(View view, ContentInfoCompat contentInfo) { Pair<ContentInfoCompat, ContentInfoCompat> split = contentInfo.partition( item -> item.getUri() != null); ContentInfo uriContent = split.first; ContentInfo remaining = split.second; if (uriContent != null) { // App-specific logic to handle the URI(s) in uriContent. } // Return anything that your app didn't handle. This preserves the // default platform behavior for text and anything else that you aren't // implementing custom handling for. return remaining; } }
अगर आपका ऐप्लिकेशन पहले से ही इंटेंट के साथ शेयर करने की सुविधा देता है, तो कॉन्टेंट यूआरआई को मैनेज करने के लिए खास तौर पर ऐप्लिकेशन के लिए बना लॉजिक. बाकी बचे डेटा को प्लैटफ़ॉर्म को सौंपने के लिए, उसे दिखाएं.
लिसनर लागू करने के बाद, इसे अपने ऐप्लिकेशन में सही यूज़र इंटरफ़ेस (यूआई) एलिमेंट पर सेट करें:
class MyActivity : Activity() { public override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // ... val myInput = findViewById(R.id.my_input) ViewCompat.setOnReceiveContentListener(myInput, MyReceiver.MIME_TYPES, MyReceiver()) } }
public class MyActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { // ... AppCompatEditText myInput = findViewById(R.id.my_input); ViewCompat.setOnReceiveContentListener(myInput, MyReceiver.MIME_TYPES, new MyReceiver()); } }
यूआरआई की अनुमतियां
OnReceiveContentListener
को भेजे गए पेलोड में मौजूद किसी भी कॉन्टेंट यूआरआई के लिए, प्लैटफ़ॉर्म पढ़ने की अनुमतियां देता है और उन्हें अपने-आप रिलीज़ कर देता है.
आम तौर पर, आपका ऐप्लिकेशन किसी सेवा या गतिविधि में कॉन्टेंट यूआरआई को प्रोसेस करता है. इसके लिए
लंबे समय तक चलने वाली प्रोसेसिंग, इसका इस्तेमाल करें
WorkManager. लागू करने पर
इसके बाद,
का इस्तेमाल कर रहा है
Intent.setClipData
और फ़्लैग को सेट कर रहे हैं
FLAG_GRANT_READ_URI_PERMISSION
.
इसके अलावा, मौजूदा कॉन्टेक्स्ट में बैकग्राउंड थ्रेड का इस्तेमाल करके भी ऐसा किया जा सकता है
कॉन्टेंट को प्रोसेस करना. इस मामले में, आपको
लिसनर को payload
ऑब्जेक्ट मिला, ताकि यह पक्का किया जा सके कि अनुमतियां न हों
जिन्हें प्लैटफ़ॉर्म ने समय से पहले रद्द कर दिया था.
कस्टम व्यू
अगर आपका ऐप्लिकेशन कस्टम View
सबक्लास का इस्तेमाल करता है, तो पक्का करें कि OnReceiveContentListener
को बायपास न किया गया हो.
अगर आपकी View
क्लास
onCreateInputConnection
तरीका है, तो Jetpack API का इस्तेमाल करें
InputConnectionCompat.createWrapper
InputConnection
को कॉन्फ़िगर करने के लिए.
अगर आपकी View
क्लास
onTextContextMenuItem
तरीका होता है, तो मेन्यू आइटम के
R.id.paste
या
R.id.pasteAsPlainText
.
कीबोर्ड इमेज एपीआई के साथ तुलना
OnReceiveContentListener
एपीआई को, मौजूदा कीबोर्ड इमेज एपीआई के अगले वर्शन के तौर पर देखा जा सकता है. इसे एक जगह पर दिखाया गया है
एपीआई, कीबोर्ड इमेज एपीआई के काम करने के साथ-साथ कुछ और सुविधाओं के साथ काम करता है
अतिरिक्त सुविधाएं. डिवाइस और सुविधा के साथ काम करने की क्षमता इस बात पर निर्भर करती है कि आपने Android SDK टूल की Jetpack लाइब्रेरी का इस्तेमाल किया है या नेटिव एपीआई का.
कार्रवाई या सुविधा | कीबोर्ड इमेज एपीआई के साथ काम करता है | यह सुविधा, यूनिफ़ाइड एपीआई के साथ काम करती है |
---|---|---|
कीबोर्ड से शामिल करना | हां (एपीआई लेवल 13 और उसके बाद के वर्शन) | हां (एपीआई लेवल 13 और उसके बाद के लेवल) |
स्पर्श करें और होल्ड मेन्यू | नहीं | हां |
खींचें और छोड़ें सुविधा का इस्तेमाल करके शामिल करना | नहीं | हां (एपीआई लेवल 24 और उसके बाद के लेवल) |
कार्रवाई या सुविधा | कीबोर्ड इमेज एपीआई के साथ काम करता है | यह सुविधा, यूनिफ़ाइड एपीआई के साथ काम करती है |
---|---|---|
कीबोर्ड से शामिल करना | हां (एपीआई लेवल 25 और उसके बाद के वर्शन) | हां (Android 12 और उसके बाद के वर्शन के लिए) |
दबाकर रखने पर दिखने वाले मेन्यू में जाकर, चिपकाने की सुविधा का इस्तेमाल करके टेक्स्ट डालना | नहीं | |
खींचें और छोड़ें का इस्तेमाल करके शामिल करें | नहीं |