लोगों को इमेज, वीडियो, और भावनाएं ज़ाहिर करने वाला अन्य कॉन्टेंट पसंद आता है. हालांकि, अपने इस कॉन्टेंट को ऐप्लिकेशन में ले जाना हमेशा आसान नहीं होता. ऐप्लिकेशन के लिए, काम करना आसान बनाने के लिए बेहतर कॉन्टेंट पाने के लिए, Android 12 (एपीआई लेवल 31) में एक ऐसा एपीआई जोड़ा गया है जो आपके ऐप्लिकेशन को किसी भी सोर्स से कॉन्टेंट स्वीकार करने की अनुमति देता है: क्लिपबोर्ड, कीबोर्ड या खींचकर छोड़ें.
आपके पास कोई इंटरफ़ेस अटैच करने का विकल्प है, जैसे कि
OnReceiveContentListener
और कॉन्टेंट को किसी भी यूज़र इंटरफ़ेस (यूआई) कॉम्पोनेंट के ज़रिए डालने पर कॉलबैक पाएं
मैकेनिज़्म. कॉलबैक वह एक जगह बन जाता है जहां आपका कोड हैंडल करता है
इसमें सादे और अलग-अलग स्टाइल के टेक्स्ट से लेकर मार्कअप, इमेज, वीडियो तक का पूरा कॉन्टेंट शामिल होता है.
ऑडियो फ़ाइलें वगैरह.
Android के पुराने वर्शन के साथ काम करने के लिए, यह एपीआई भी AndroidX में उपलब्ध है, जो यहां से शुरू हो रहा है: कोर 1.7 और Appcompat 1.4, हमारा सुझाव है कि इस सुविधा को लागू करते समय, इसका इस्तेमाल करें.
खास जानकारी
अन्य मौजूदा API के साथ, प्रत्येक यूज़र इंटरफ़ेस (यूआई) तंत्र—जैसे कि टच और होल्ड मेन्यू या खींचने और छोड़ने पर—उसका खुद का एपीआई होता है. इसका मतलब है कि आपको हर एपीआई के साथ अलग-अलग इंटिग्रेट करें. साथ ही, हर उस तरीके के लिए एक जैसा कोड जोड़ें जिसमें सामग्री सम्मिलित करता है:
OnReceiveContentListener
एपीआई, इन अलग-अलग कोड पाथ को इसके अनुसार इकट्ठा करता है
सिंगल एपीआई बनाकर उसे लागू किया जा सकता है, ताकि आप ऐप्लिकेशन के खास लॉजिक पर फ़ोकस कर सकें
फिर बाकी काम प्लैटफ़ॉर्म पर छोड़ दें:
इसका मतलब यह भी है कि अगर कॉन्टेंट डालने के नए तरीके तो आपको सहायता केंद्र चालू करने के लिए, कोड में दूसरे बदलाव करने की ज़रूरत नहीं है आपके ऐप्लिकेशन में. अगर आपके ऐप्लिकेशन को इस्तेमाल का उदाहरण देते हैं, तब भी मौजूदा एपीआई का इस्तेमाल किया जा सकता है, जो काम करते रहते हैं उसी तरह.
लागू करना
यह एपीआई एक लिसनर इंटरफ़ेस है, जो एक ही तरीके का इस्तेमाल करता है.
OnReceiveContentListener
.
Android प्लैटफ़ॉर्म के पुराने वर्शन के साथ काम करने के लिए, हमारा सुझाव है कि
मिलता-जुलता
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 टाइप तय करने के बाद, लागू करें बाकी लिसनर:
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
तरीका है, तो Jetpack API का इस्तेमाल करें
InputConnectionCompat.createWrapper
InputConnection
को कॉन्फ़िगर करने के लिए.
अगर आपकी View
क्लास
onTextContextMenuItem
तरीका होता है, तो मेन्यू आइटम के
R.id.paste
या
R.id.pasteAsPlainText
.
कीबोर्ड इमेज एपीआई से तुलना
आप OnReceiveContentListener
API को
मौजूदा कीबोर्ड इमेज एपीआई. इसे एक जगह पर दिखाया गया है
एपीआई, कीबोर्ड इमेज एपीआई के काम करने के साथ-साथ कुछ और सुविधाओं के साथ काम करता है
अतिरिक्त सुविधाएं. अलग-अलग डिवाइस और सुविधाएं एक साथ काम करती हैं या नहीं, यह इससे तय होता है कि
भले ही, आप Jetpack लाइब्रेरी इस्तेमाल कर रहे हों या Android SDK के नेटिव एपीआई का इस्तेमाल कर रहे हों.
कार्रवाई या सुविधा | कीबोर्ड इमेज एपीआई के साथ काम करता है | यूनिफ़ाइड एपीआई के साथ काम करता है |
---|---|---|
कीबोर्ड से शामिल करना | हां (एपीआई लेवल 13 और उसके बाद के लेवल) | हां (एपीआई लेवल 13 और उसके बाद के लेवल) |
स्पर्श करें और होल्ड मेन्यू | नहीं | हां |
खींचें और छोड़ें का इस्तेमाल करके शामिल करें | नहीं | हां (एपीआई लेवल 24 और उसके बाद के लेवल) |
कार्रवाई या सुविधा | कीबोर्ड इमेज एपीआई के साथ काम करता है | यूनिफ़ाइड एपीआई के साथ काम करता है |
---|---|---|
कीबोर्ड से शामिल करना | हां (एपीआई लेवल 25 और उसके बाद के लेवल) | हां (Android 12 और उसके बाद वाले वर्शन के लिए) |
स्पर्श करें और होल्ड मेन्यू | नहीं | |
खींचें और छोड़ें का इस्तेमाल करके शामिल करें | नहीं |