रिच कॉन्टेंट पाएं

पहली इमेज. यूनिफ़ाइड एपीआई, एक ही जगह से हैंडल करने की सुविधा देता है भले ही उपयोगकर्ता ने किसी खास यूज़र इंटरफ़ेस (यूआई) का इस्तेमाल किया हो, जैसे कि चिपकाना और मेन्यू को दबाकर रखें या 'खींचें और छोड़ें' सुविधा का इस्तेमाल करें.

लोगों को इमेज, वीडियो, और भावनाएं ज़ाहिर करने वाला अन्य कॉन्टेंट पसंद आता है. हालांकि, अपने इस कॉन्टेंट को ऐप्लिकेशन में ले जाना हमेशा आसान नहीं होता. ऐप्लिकेशन के लिए, काम करना आसान बनाने के लिए बेहतर कॉन्टेंट पाने के लिए, 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 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 के नेटिव एपीआई का इस्तेमाल कर रहे हों.

टेबल 1. इनके साथ काम करने वाली सुविधाएं और एपीआई लेवल जेटपैक.
कार्रवाई या सुविधा कीबोर्ड इमेज एपीआई के साथ काम करता है यूनिफ़ाइड एपीआई के साथ काम करता है
कीबोर्ड से शामिल करना हां (एपीआई लेवल 13 और उसके बाद के लेवल) हां (एपीआई लेवल 13 और उसके बाद के लेवल)
स्पर्श करें और होल्ड मेन्यू नहीं हां
खींचें और छोड़ें का इस्तेमाल करके शामिल करें नहीं हां (एपीआई लेवल 24 और उसके बाद के लेवल)
टेबल 2. नेटिव विज्ञापनों के लिए इस्तेमाल की जा सकने वाली सुविधाएं और एपीआई लेवल एपीआई.
कार्रवाई या सुविधा कीबोर्ड इमेज एपीआई के साथ काम करता है यूनिफ़ाइड एपीआई के साथ काम करता है
कीबोर्ड से शामिल करना हां (एपीआई लेवल 25 और उसके बाद के लेवल) हां (Android 12 और उसके बाद वाले वर्शन के लिए)
स्पर्श करें और होल्ड मेन्यू नहीं
खींचें और छोड़ें का इस्तेमाल करके शामिल करें नहीं