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

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

उपयोगकर्ताओं को इमेज, वीडियो, और अन्य तरह का कॉन्टेंट पसंद आता है. हालांकि, ऐप्लिकेशन में इस कॉन्टेंट को डालना और उसे एक जगह से दूसरी जगह ले जाना हमेशा आसान नहीं होता. ऐप्लिकेशन के लिए रिच कॉन्टेंट पाना आसान बनाने के लिए, Android 12 (एपीआई लेवल 31) में एक यूनिफ़ाइड एपीआई जोड़ा गया है. इसकी मदद से, आपका ऐप्लिकेशन किसी भी सोर्स से कॉन्टेंट स्वीकार कर सकता है. जैसे, क्लिपबोर्ड, कीबोर्ड या खींचकर छोड़ना.

यूज़र इंटरफ़ेस (यूआई) कॉम्पोनेंट में OnReceiveContentListener जैसा कोई इंटरफ़ेस अटैच किया जा सकता है. साथ ही, किसी भी तरीके से कॉन्टेंट डालने पर कॉलबैक पाया जा सकता है. कॉलबैक, आपके कोड के लिए एक ही जगह बन जाता है. इससे, सादे और स्टाइल वाले टेक्स्ट से लेकर मार्कअप, इमेज, वीडियो, ऑडियो फ़ाइलों वगैरह तक का सारा कॉन्टेंट मैनेज किया जा सकता है.

Android के पुराने वर्शन के साथ काम करने की सुविधा के लिए, यह एपीआई AndroidX में भी उपलब्ध है. यह Core 1.7 और Appcompat 1.4 से शुरू होता है. हमारा सुझाव है कि इस सुविधा को लागू करते समय, इनका इस्तेमाल करें.

खास जानकारी

अन्य मौजूदा एपीआई के साथ, हर यूज़र इंटरफ़ेस (यूआई) मैकेनिज़्म का अपना एपीआई होता है. जैसे, दबाकर रखने वाला मेन्यू या खींचकर छोड़ने वाला मेन्यू. इसका मतलब है कि आपको हर एपीआई के साथ अलग से इंटिग्रेट करना होगा. साथ ही, कॉन्टेंट डालने वाले हर तरीके के लिए एक जैसा कोड जोड़ना होगा:

इस इमेज में, अलग-अलग कार्रवाइयां और उन्हें लागू करने के लिए ज़रूरी एपीआई दिखाए गए हैं
दूसरी इमेज. पहले, ऐप्लिकेशन कॉन्टेंट डालने के लिए हर यूज़र इंटरफ़ेस (यूआई) के लिए अलग-अलग एपीआई लागू करते थे.

OnReceiveContentListener एपीआई, इन अलग-अलग कोड पाथ को एक साथ जोड़ता है. इसके लिए, वह एक एपीआई बनाता है, ताकि आप अपने ऐप्लिकेशन के हिसाब से लॉजिक पर ध्यान दे सकें और बाकी काम प्लैटफ़ॉर्म पर छोड़ सकें:

आसान यूनिफ़ाइड एपीआई दिखाने वाली इमेज
तीसरी इमेज. यूनिफ़ाइड एपीआई की मदद से, एक ऐसा एपीआई लागू किया जा सकता है जो सभी यूज़र इंटरफ़ेस (यूआई) मैकेनिज़्म के साथ काम करता है.

इस तरीके का मतलब यह भी है कि जब प्लैटफ़ॉर्म पर कॉन्टेंट डालने के नए तरीके जोड़े जाते हैं, तो आपको अपने ऐप्लिकेशन में सहायता चालू करने के लिए, कोड में अतिरिक्त बदलाव करने की ज़रूरत नहीं होती. अगर आपके ऐप्लिकेशन को किसी खास इस्तेमाल के उदाहरण के लिए, पूरी तरह से कस्टमाइज़ेशन लागू करना है, तो आपके पास अब भी मौजूदा एपीआई इस्तेमाल करने का विकल्प है. ये एपीआई पहले की तरह ही काम करते रहेंगे.

लागू करना

एपीआई एक लिसनर इंटरफ़ेस है, जिसमें सिर्फ़ एक तरीका, OnReceiveContentListener होता है. Android प्लैटफ़ॉर्म के पुराने वर्शन के साथ काम करने के लिए, हमारा सुझाव है कि आप AndroidX Core लाइब्रेरी में मौजूद, मिलते-जुलते 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/*"};
     // ...
}

अपने ऐप्लिकेशन के साथ काम करने वाले सभी कॉन्टेंट के एमआईएमई टाइप तय करने के बाद, बाकी लिसनर को लागू करें:

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 एपीआई को, मौजूदा कीबोर्ड इमेज एपीआई के अगले वर्शन के तौर पर देखा जा सकता है. यह यूनिफ़ाइड एपीआई, कीबोर्ड इमेज एपीआई की सुविधाओं के साथ-साथ कुछ अन्य सुविधाओं के साथ भी काम करता है. डिवाइस और सुविधा के साथ काम करने की क्षमता इस बात पर निर्भर करती है कि Jetpack लाइब्रेरी का इस्तेमाल किया जा रहा है या Android SDK के नेटिव एपीआई का.

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