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

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

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

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

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

खास जानकारी

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

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

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

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

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

लागू करना

एपीआई, एक तरीके वाला लिसनर इंटरफ़ेस है, OnReceiveContentListener. Android प्लैटफ़ॉर्म के पुराने वर्शन के साथ काम करने के लिए, हमारा सुझाव है कि आप AndroidX कोर लाइब्रेरी में, मिलते-जुलते OnReceiveContentListener इंटरफ़ेस का इस्तेमाल करें.

एपीआई का इस्तेमाल करने के लिए, यह बताकर लिसनर लागू करें कि आपका ऐप्लिकेशन किस तरह का कॉन्टेंट मैनेज कर सकता है:

KotlinJava
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 टाइप तय करने के बाद, लागू करें बाकी लिसनर:

KotlinJava
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;
     }
 }

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

लिसनर लागू करने के बाद, इसे अपने ऐप्लिकेशन में सही यूज़र इंटरफ़ेस (यूआई) एलिमेंट पर सेट करें:

KotlinJava
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 लाइब्रेरी का इस्तेमाल किया है या नेटिव एपीआई का.

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