उपयोगकर्ताओं को इमेज, वीडियो, और दूसरे तरह के कॉन्टेंट पसंद आते हैं. हालांकि, ऐप्लिकेशन में इस कॉन्टेंट को डालना और एक जगह से दूसरी जगह ले जाना हमेशा आसान नहीं होता. ऐप्लिकेशन को बेहतर कॉन्टेंट पाने में आसानी हो, इसके लिए Android 12 (एपीआई लेवल 31) में एक यूनिफ़ाइड एपीआई जोड़ा गया है. इसकी मदद से, आपका ऐप्लिकेशन क्लिपबोर्ड, कीबोर्ड या खींचकर छोड़ने जैसे किसी भी सोर्स से कॉन्टेंट स्वीकार कर सकता है.
यूज़र इंटरफ़ेस (यूआई) कॉम्पोनेंट में, OnReceiveContentListener
जैसे इंटरफ़ेस को अटैच किया जा सकता है. साथ ही, किसी भी तरीके से कॉन्टेंट डालने पर कॉलबैक भी पाया जा सकता है. कॉलबैक एक ऐसी जगह बन जाता है जहां आपका कोड
सारे और स्टाइल वाले टेक्स्ट से लेकर मार्कअप, इमेज, वीडियो,
ऑडियो फ़ाइलों, और दूसरी चीज़ों तक सारा कॉन्टेंट
पाने का काम मैनेज करता है.
Android के पुराने वर्शन के साथ काम करने के लिए, यह एपीआई AndroidX में भी उपलब्ध है. यह Core 1.7 और Appcompat 1.4 से शुरू होता है. हमारा सुझाव है कि इस सुविधा को लागू करते समय, इसका इस्तेमाल करें.
खास जानकारी
मौजूदा अन्य एपीआई के साथ, हर यूज़र इंटरफ़ेस (यूआई) मैकेनिज्म का अपना एपीआई होता है. जैसे, मेन्यू को दबाकर रखना या खींचकर छोड़ना. इसका मतलब है कि आपको हर एपीआई के साथ अलग से इंटिग्रेट करना होगा. साथ ही, कॉन्टेंट डालने वाले हर तरीके के लिए मिलता-जुलता कोड जोड़ना होगा:
OnReceiveContentListener
एपीआई, लागू करने के लिए एक एपीआई बनाकर, इन अलग-अलग कोड पाथ को एक साथ जोड़ता है. इससे, आपके पास अपने ऐप्लिकेशन के लॉजिक पर फ़ोकस करने का विकल्प होता है और बाकी काम प्लैटफ़ॉर्म को करने दिया जा सकता है:
इस तरीके का मतलब यह भी है कि जब प्लैटफ़ॉर्म में कॉन्टेंट डालने के नए तरीके जोड़े जाते हैं, तो आपको अपने ऐप्लिकेशन में सहायता चालू करने के लिए, कोड में और बदलाव करने की ज़रूरत नहीं होती. अगर आपके ऐप्लिकेशन को किसी खास इस्तेमाल के उदाहरण के लिए, पूरी तरह से कस्टमाइज़ करने की ज़रूरत है, तो अब भी मौजूदा एपीआई का इस्तेमाल किया जा सकता है. ये एपीआई पहले की तरह ही काम करते रहेंगे.
लागू करना
एपीआई, एक तरीके वाला लिसनर इंटरफ़ेस है,
OnReceiveContentListener
.
Android प्लैटफ़ॉर्म के पुराने वर्शन के साथ काम करने के लिए, हमारा सुझाव है कि आप AndroidX कोर लाइब्रेरी में, मिलते-जुलते OnReceiveContentListener
इंटरफ़ेस का इस्तेमाल करें.
एपीआई का इस्तेमाल करने के लिए, लिसनर को यह तय करके लागू करें कि आपका ऐप्लिकेशन किस तरह का कॉन्टेंट हैंडल कर सकता है:
Kotlin
object MyReceiver : OnReceiveContentListener { val MIME_TYPES = arrayOf("image/*", "video/*") // ... override fun onReceiveContent(view: View, payload: ContentInfoCompat): ContentInfoCompat? { TODO("Not yet implemented") } }
Java
public class MyReceiver implements OnReceiveContentListener { public static final String[] MIME_TYPES = new String[] {"image/*", "video/*"}; // ... }
आपके ऐप्लिकेशन पर काम करने वाले कॉन्टेंट के सभी MIME टाइप तय करने के बाद, बाकी के Listener लागू करें:
Kotlin
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/*") } }
Java
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; } }
अगर आपके ऐप्लिकेशन में पहले से ही इंटेंट के साथ शेयर करने की सुविधा है, तो कॉन्टेंट यूआरआई को मैनेज करने के लिए, ऐप्लिकेशन के खास लॉजिक का फिर से इस्तेमाल किया जा सकता है. बाकी बचे डेटा को प्लैटफ़ॉर्म को सौंपने के लिए, उसे दिखाएं.
लिसनर लागू करने के बाद, इसे अपने ऐप्लिकेशन में सही यूज़र इंटरफ़ेस (यूआई) एलिमेंट पर सेट करें:
Kotlin
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()) } }
Java
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
वाले तरीके को बदल देती है, तो InputConnection
को कॉन्फ़िगर करने के लिए, Jetpack API InputConnectionCompat.createWrapper
का इस्तेमाल करें.
अगर आपकी View
क्लास, onTextContextMenuItem
वाले तरीके को बदल देती है, तो मेन्यू आइटम के R.id.paste
या R.id.pasteAsPlainText
होने पर, सुपर को काम सौंपें.
कीबोर्ड इमेज एपीआई के साथ तुलना
OnReceiveContentListener
एपीआई को, मौजूदा कीबोर्ड इमेज एपीआई के अगले वर्शन के तौर पर देखा जा सकता है. यह यूनिफ़ाइड एपीआई, कीबोर्ड इमेज एपीआई की सुविधा के साथ-साथ कुछ अन्य सुविधाओं के साथ भी काम करता है. डिवाइस और सुविधा के साथ काम करने की क्षमता इस बात पर निर्भर करती है कि आपने Android SDK टूल की Jetpack लाइब्रेरी का इस्तेमाल किया है या नेटिव एपीआई का.
कार्रवाई या सुविधा | कीबोर्ड इमेज एपीआई के साथ काम करता है | यह सुविधा, यूनिफ़ाइड एपीआई के साथ काम करती है |
---|---|---|
कीबोर्ड से शामिल करना | हां (एपीआई लेवल 13 और उसके बाद के वर्शन) | हां (एपीआई लेवल 13 और उसके बाद के वर्शन) |
दबाकर रखने पर दिखने वाले मेन्यू में जाकर, चिपकाने की सुविधा का इस्तेमाल करके टेक्स्ट डालना | नहीं | हां |
खींचें और छोड़ें सुविधा का इस्तेमाल करके शामिल करना | नहीं | हां (एपीआई लेवल 24 और उसके बाद के वर्शन) |
कार्रवाई या सुविधा | कीबोर्ड इमेज एपीआई के साथ काम करता है | यह सुविधा, यूनिफ़ाइड एपीआई के साथ काम करती है |
---|---|---|
कीबोर्ड से शामिल करना | हां (एपीआई लेवल 25 और उसके बाद के वर्शन) | हां (Android 12 और उसके बाद वाले वर्शन के लिए) |
'दबाकर रखें' मेन्यू से चिपकाने के विकल्प का इस्तेमाल करके शामिल करें | नहीं | |
खींचें और छोड़ें का इस्तेमाल करके शामिल करें | नहीं |