कॉपी करें और चिपकाएं

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

फ़्रेमवर्क के हिस्से के तौर पर कॉन्टेंट देने वालों का इस्तेमाल किया जाता है. इसलिए, यह माना जा रहा है कि इस दस्तावेज़ के लिए, Android Content Provider API, जिसकी जानकारी इसमें दी गई है कॉन्टेंट देने वाले.

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

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

Android 12L (एपीआई लेवल 32) और इससे पहले के वर्शन में कॉपी करने के दौरान, लोगों को मैन्युअल तरीके से सुझाव/राय दें या शिकायत करें. यहां जाएं: इस दस्तावेज़ में इसके लिए सुझाव देखें.

क्लिपबोर्ड फ़्रेमवर्क

क्लिपबोर्ड फ़्रेमवर्क का इस्तेमाल करते समय, डेटा को क्लिप ऑब्जेक्ट में रखें. इसके बाद, क्लिप ऑब्जेक्ट को रखें पर लागू किया जा सकता है. क्लिप ऑब्जेक्ट इन तीन में से कोई एक रूप ले सकता है:

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

क्लिपबोर्ड पर एक बार में सिर्फ़ एक क्लिप ऑब्जेक्ट सेव किया जाता है. जब कोई ऐप्लिकेशन किसी क्लिप ऑब्जेक्ट को क्लिपबोर्ड पर, पिछला क्लिप ऑब्जेक्ट गायब हो जाता है.

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

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

क्लिपबोर्ड की क्लास

इस सेक्शन में उन क्लास के बारे में बताया गया है जिन्हें क्लिपबोर्ड फ़्रेमवर्क में इस्तेमाल किया जाता है.

क्लिपबोर्ड मैनेजर

Android सिस्टम के क्लिपबोर्ड को दुनिया भर में दिखाया जाता है ClipboardManager क्लास. इस क्लास को सीधे तौर पर इंस्टैंशिएट न करें. इसके बजाय, शुरू करके इसका रेफ़रंस पाएं getSystemService(CLIPBOARD_SERVICE).

ClipData, ClipData.Item, और ClipDescription

क्लिपबोर्ड पर डेटा जोड़ने के लिए, एक बनाएं ClipData ऑब्जेक्ट जिसमें यह शामिल है और डेटा की जानकारी. क्लिपबोर्ड एक ClipData को दबाकर रखता है समय. ClipData में ClipDescription ऑब्जेक्ट और एक या उससे ज़्यादा ClipData.Item ऑब्जेक्ट.

ClipDescription ऑब्जेक्ट में, क्लिप के बारे में मेटाडेटा मौजूद है. खास तौर पर, यह इसमें क्लिप के डेटा के लिए उपलब्ध MIME टाइप का कलेक्शन होता है. साथ ही, चालू है Android 12 (एपीआई लेवल 31) और उसके बाद के वर्शन वाले वर्शन में, मेटाडेटा में यह जानकारी शामिल होती है कि ऑब्जेक्ट यह होनी चाहिए बेहतर बनाए गए टेक्स्ट और ऑब्जेक्ट में टेक्स्ट का टाइप. जब आप क्लिपबोर्ड पर कोई क्लिप रखते हैं, तो यह जानकारी इन अनुप्रयोगों को चिपकाने के लिए उपलब्ध होती है, वे क्लिप के डेटा को हैंडल कर सकते हैं या नहीं.

ClipData.Item ऑब्जेक्ट में टेक्स्ट, यूआरआई या इंटेंट डेटा होता है:

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

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

ClipData सुविधा के तरीके

ClipData क्लास स्टैटिक सुविधा के तरीके उपलब्ध कराती है. एक ClipData.Item ऑब्जेक्ट और सामान्य साइज़ वाला ClipData ऑब्जेक्ट ClipDescription ऑब्जेक्ट:

newPlainText(label, text)
वह ClipData ऑब्जेक्ट दिखाता है जिसका एक ClipData.Item ऑब्जेक्ट होता है टेक्स्ट स्ट्रिंग मौजूद हो. ClipDescription ऑब्जेक्ट का लेबल इस पर सेट है label. ClipDescription में एक MIME टाइप यह है MIMETYPE_TEXT_PLAIN.

किसी टेक्स्ट स्ट्रिंग से क्लिप बनाने के लिए, newPlainText() का इस्तेमाल करें.

newUri(resolver, label, URI)
वह ClipData ऑब्जेक्ट दिखाता है जिसका एक ClipData.Item ऑब्जेक्ट होता है में एक यूआरआई है. ClipDescription ऑब्जेक्ट का लेबल इस पर सेट है label. अगर यूआरआई एक कॉन्टेंट यूआरआई है—यानी, अगर Uri.getScheme() अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है नतीजे के तौर पर content: दिखाता है—यह तरीका इस्तेमाल करके ContentResolver ऑब्जेक्ट से उपलब्ध MIME टाइप को वापस पाने के लिए, resolver में दिया गया ऑब्जेक्ट कॉन्टेंट देने वाला. इसके बाद, यह उन्हें ClipDescription में सेव कर देता है. ऐसे यूआरआई के लिए जो content: यूआरआई का इस्तेमाल करके, यह तरीका MIME टाइप को MIMETYPE_TEXT_URILIST.

यूआरआई से क्लिप बनाने के लिए newUri() का इस्तेमाल करें—खास तौर पर content: यूआरआई.

newIntent(label, intent)
वह ClipData ऑब्जेक्ट दिखाता है जिसका एक ClipData.Item ऑब्जेक्ट होता है Intent मौजूद है. ClipDescription ऑब्जेक्ट का लेबल इस पर सेट है label. MIME प्रकार इस पर सेट है MIMETYPE_TEXT_INTENT.

किसी Intent ऑब्जेक्ट से क्लिप बनाने के लिए, newIntent() का इस्तेमाल करें.

क्लिपबोर्ड डेटा को टेक्स्ट में बदलें

भले ही आपका ऐप्लिकेशन केवल टेक्स्ट हैंडल करता हो, फिर भी आप क्लिपबोर्ड से बिना टेक्स्ट वाले डेटा को इसके अनुसार कॉपी कर सकते हैं उसे इस ClipData.Item.coerceToText() अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है तरीका.

यह तरीका ClipData.Item के डेटा को टेक्स्ट में बदलता है और CharSequence. ClipData.Item.coerceToText() से मिलने वाली वैल्यू इस आधार पर तय होती है ClipData.Item में दिए गए डेटा के मुताबिक:

टेक्स्ट
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है अगर ClipData.Item टेक्स्ट है—यानी, अगर getText() शून्य नहीं है—coerceToText() फ़ंक्शन टेक्स्ट दिखाता है.
यूआरआई
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है अगर ClipData.Item एक यूआरआई है—यानी, अगर getUri() शून्य नहीं है—coerceToText() इसका इस्तेमाल कॉन्टेंट यूआरआई के तौर पर करने की कोशिश करता है.
  • अगर यूआरआई एक कॉन्टेंट यूआरआई है और सेवा देने वाली कंपनी टेक्स्ट स्ट्रीम लौटा सकती है, coerceToText() टेक्स्ट स्ट्रीम दिखाता है.
  • अगर यूआरआई एक कॉन्टेंट यूआरआई है, लेकिन सेवा देने वाली कंपनी टेक्स्ट स्ट्रीम नहीं देती है, तो coerceToText() यूआरआई का निरूपण करता है. प्रतिनिधित्व है इसके ज़रिए वापस की गई रकम के बराबर Uri.toString().
  • अगर यूआरआई कॉन्टेंट का यूआरआई नहीं है, तो coerceToText() फ़ंक्शन दिखाता है यूआरआई. निरूपण वही है जो इसके आधार पर दिखाया गया है Uri.toString().
इंटेंट
अगर ClipData.Item एक Intent है—यानी, अगर getIntent() शून्य नहीं है—coerceToText() इसे एक इंटेंट यूआरआई में बदलता है और इसे लौटाता है. निरूपण वही है जो इसके आधार पर दिखाया गया है Intent.toUri(URI_INTENT_SCHEME).

क्लिपबोर्ड फ़्रेमवर्क की खास जानकारी दूसरी इमेज में दी गई है. डेटा कॉपी करने के लिए, कोई ऐप्लिकेशन ClipboardManager ग्लोबल क्लिपबोर्ड पर ClipData ऑब्जेक्ट है. कॉन्टेंट बनाने ClipData में एक या ज़्यादा ClipData.Item ऑब्जेक्ट और एक ऑब्जेक्ट है ClipDescription ऑब्जेक्ट. डेटा चिपकाने के लिए, किसी ऐप्लिकेशन को ClipData, अपने MIME टाइप को ClipDescription से हासिल करता है और ClipData.Item या कॉन्टेंट देने वाले उस व्यक्ति या कंपनी की ओर से जिसका रेफ़रंस दिया गया है ClipData.Item.

को दबाकर रखें
कॉपी करें और चिपकाएं फ़्रेमवर्क का ब्लॉक डायग्राम दिखाने वाली इमेज
दूसरी इमेज. Android क्लिपबोर्ड फ़्रेमवर्क.

क्लिपबोर्ड पर कॉपी करें

डेटा को क्लिपबोर्ड पर कॉपी करने के लिए, ग्लोबल ClipboardManager ऑब्जेक्ट को हैंडल करें, एक ClipData ऑब्जेक्ट बनाएं. साथ ही, एक ClipDescription और एक या उससे ज़्यादा ऑब्जेक्ट जोड़ें इसमें ClipData.Item ऑब्जेक्ट है. इसके बाद, तैयार हो चुका ClipData ऑब्जेक्ट इसमें जोड़ें ClipboardManager ऑब्जेक्ट. नीचे दी गई प्रक्रिया में इसका ब्यौरा दिया गया है:

  1. अगर कॉन्टेंट यूआरआई का इस्तेमाल करके डेटा कॉपी किया जा रहा है, तो कॉन्टेंट देने वाला सेट अप करें.
  2. सिस्टम का क्लिपबोर्ड पाएं:

    Kotlin

    when(menuItem.itemId) {
        ...
        R.id.menu_copy -> { // if the user selects copy
            // Gets a handle to the clipboard service.
            val clipboard = getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
        }
    }
    

    Java

    ...
    // If the user selects copy.
    case R.id.menu_copy:
    
    // Gets a handle to the clipboard service.
    ClipboardManager clipboard = (ClipboardManager)
            getSystemService(Context.CLIPBOARD_SERVICE);
    
  3. डेटा को नए ClipData ऑब्जेक्ट में कॉपी करें:

    • टेक्स्ट के लिए

      Kotlin

      // Creates a new text clip to put on the clipboard.
      val clip: ClipData = ClipData.newPlainText("simple text", "Hello, World!")
      

      Java

      // Creates a new text clip to put on the clipboard.
      ClipData clip = ClipData.newPlainText("simple text", "Hello, World!");
      
    • यूआरआई के लिए

      यह स्निपेट एक रिकॉर्ड आईडी को कॉन्टेंट के यूआरआई पर एन्कोड करके एक यूआरआई बनाता है . इस तकनीक के बारे में ज़्यादा जानकारी यहां दी गई है यूआरआई सेक्शन पर आइडेंटिफ़ायर को कोड में बदलना सेक्शन.

      Kotlin

      // Creates a Uri using a base Uri and a record ID based on the contact's last
      // name. Declares the base URI string.
      const val CONTACTS = "content://com.example.contacts"
      
      // Declares a path string for URIs, used to copy data.
      const val COPY_PATH = "/copy"
      
      // Declares the Uri to paste to the clipboard.
      val copyUri: Uri = Uri.parse("$CONTACTS$COPY_PATH/$lastName")
      ...
      // Creates a new URI clip object. The system uses the anonymous
      // getContentResolver() object to get MIME types from provider. The clip object's
      // label is "URI", and its data is the Uri previously created.
      val clip: ClipData = ClipData.newUri(contentResolver, "URI", copyUri)
      

      Java

      // Creates a Uri using a base Uri and a record ID based on the contact's last
      // name. Declares the base URI string.
      private static final String CONTACTS = "content://com.example.contacts";
      
      // Declares a path string for URIs, used to copy data.
      private static final String COPY_PATH = "/copy";
      
      // Declares the Uri to paste to the clipboard.
      Uri copyUri = Uri.parse(CONTACTS + COPY_PATH + "/" + lastName);
      ...
      // Creates a new URI clip object. The system uses the anonymous
      // getContentResolver() object to get MIME types from provider. The clip object's
      // label is "URI", and its data is the Uri previously created.
      ClipData clip = ClipData.newUri(getContentResolver(), "URI", copyUri);
      
    • इंटेंट के लिए

      यह स्निपेट किसी ऐप्लिकेशन के लिए एक Intent बनाता है और फिर क्लिप ऑब्जेक्ट में:

      Kotlin

      // Creates the Intent.
      val appIntent = Intent(this, com.example.demo.myapplication::class.java)
      ...
      // Creates a clip object with the Intent in it. Its label is "Intent"
      // and its data is the Intent object created previously.
      val clip: ClipData = ClipData.newIntent("Intent", appIntent)
      

      Java

      // Creates the Intent.
      Intent appIntent = new Intent(this, com.example.demo.myapplication.class);
      ...
      // Creates a clip object with the Intent in it. Its label is "Intent"
      // and its data is the Intent object created previously.
      ClipData clip = ClipData.newIntent("Intent", appIntent);
      
  4. नया क्लिप ऑब्जेक्ट क्लिपबोर्ड पर रखें:

    Kotlin

    // Set the clipboard's primary clip.
    clipboard.setPrimaryClip(clip)
    

    Java

    // Set the clipboard's primary clip.
    clipboard.setPrimaryClip(clip);
    

क्लिपबोर्ड पर कॉपी करते समय सुझाव दें

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

Android 13 और इसके बाद के वर्शन में, कॉन्टेंट जोड़े जाने पर सिस्टम, पुष्टि करने वाला एक स्टैंडर्ड मैसेज दिखाता है क्लिपबोर्ड पर. नई पुष्टि ये काम करती है:

  • पुष्टि करता है कि कॉन्टेंट कॉपी कर लिया गया है.
  • कॉपी किए गए कॉन्टेंट की झलक दिखाता है.

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

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

डुप्लीकेट सूचनाएं पाने से बचें

हमारा सुझाव है कि Android 12L (एपीआई लेवल 32) और इससे पहले के वर्शन वाले डिवाइसों पर, डेटा कॉपी होने पर उपयोगकर्ताओं को सूचना दें विज़ुअल, इन-ऐप्लिकेशन सुझाव, शिकायत या राय भेजने के साथ-साथ, Toast या कॉपी करने के बाद, Snackbar.

हमारा सुझाव है कि जानकारी को डुप्लीकेट न करने के लिए, टोस्ट हटा दें या स्नैकबार, जो Android 13 और उसके बाद के वर्शन में इन-ऐप्लिकेशन कॉपी के बाद दिखते हैं.

इन-ऐप्लिकेशन कॉपी के बाद स्नैकबार पोस्ट करें.
चौथी इमेज. अगर Android 13 में कॉपी की पुष्टि करने वाले स्नैकबार को दिखाया जाता है, तो जब उपयोगकर्ता को डुप्लीकेट मैसेज दिखते हैं.
इन-ऐप्लिकेशन कॉपी के बाद टोस्ट पोस्ट करें.
पांचवी इमेज. अगर Android 13 में, पुष्टि करने वाला टोस्ट दिखाया जाता है, तो जब उपयोगकर्ता को डुप्लीकेट मैसेज दिखते हैं.

यहां इसे लागू करने के तरीके का एक उदाहरण दिया गया है:

fun textCopyThenPost(textCopied:String) {
    val clipboardManager = getSystemService(CLIPBOARD_SERVICE) as ClipboardManager
    // When setting the clipboard text.
    clipboardManager.setPrimaryClip(ClipData.newPlainText   ("", textCopied))
    // Only show a toast for Android 12 and lower.
    if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.S_V2)
        Toast.makeText(context, “Copied”, Toast.LENGTH_SHORT).show()
}

क्लिपबोर्ड पर संवेदनशील कॉन्टेंट जोड़ें

अगर आपका ऐप्लिकेशन, उपयोगकर्ताओं को पासवर्ड या क्रेडिट जैसे संवेदनशील कॉन्टेंट को क्लिपबोर्ड पर कॉपी करने की अनुमति देता है कार्ड की जानकारी, आपको ClipData के ClipDescription में फ़्लैग जोड़ना होगा ClipboardManager.setPrimaryClip() पर कॉल करने से पहले. यह फ़्लैग जोड़ने पर, संवेदनशील टैब दिखने से रोका जा सकता है Android 13 और इसके बाद के वर्शन में कॉपी किए गए कॉन्टेंट की विज़ुअल पुष्टि में न दिखने से रोका गया हो.

संवेदनशील कॉन्टेंट को फ़्लैग किए बिना, टेक्स्ट की झलक कॉपी की गई
छठी इमेज. संवेदनशील कॉन्टेंट फ़्लैग के बिना टेक्स्ट की झलक कॉपी की गई.
संवेदनशील कॉन्टेंट को फ़्लैग करने वाले टेक्स्ट की झलक को कॉपी किया गया.
सातवीं इमेज. संवेदनशील कॉन्टेंट के फ़्लैग वाले टेक्स्ट की झलक को कॉपी किया गया.

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

// If your app is compiled with the API level 33 SDK or higher.
clipData.apply {
    description.extras = PersistableBundle().apply {
        putBoolean(ClipDescription.EXTRA_IS_SENSITIVE, true)
    }
}

// If your app is compiled with a lower SDK.
clipData.apply {
    description.extras = PersistableBundle().apply {
        putBoolean("android.content.extra.IS_SENSITIVE", true)
    }
}

क्लिपबोर्ड से चिपकाएं

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

सादा टेक्स्ट चिपकाएं

सादा टेक्स्ट चिपकाने के लिए, ग्लोबल क्लिपबोर्ड पाएं. साथ ही, पुष्टि करें कि यह सादा टेक्स्ट दिखा सकता है. इसके बाद पाएं आप क्लिप ऑब्जेक्ट को कॉपी कर सकते हैं और getText() का इस्तेमाल करके, उसके टेक्स्ट को अपने स्टोरेज में कॉपी कर सकते हैं, जैसा कि यहां बताया गया है यह तरीका अपनाएं:

  1. इसका इस्तेमाल करके ग्लोबल ClipboardManager ऑब्जेक्ट पाएं getSystemService(CLIPBOARD_SERVICE). साथ ही, किसी ग्लोबल वैरिएबल को शामिल करने के लिए चिपकाया गया टेक्स्ट:

    Kotlin

    var clipboard = getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
    var pasteData: String = ""
    

    Java

    ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
    String pasteData = "";
    
  2. तय करें कि आपको "चिपकाएं" को चालू या बंद करना है या नहीं मौजूदा विकल्प में गतिविधि. पुष्टि करें कि क्लिपबोर्ड में क्लिप है और आपके पास डेटा टाइप मैनेज करने का विकल्प है जिसे क्लिप से दिखाया गया है:

    Kotlin

    // Gets the ID of the "paste" menu item.
    val pasteItem: MenuItem = menu.findItem(R.id.menu_paste)
    
    // If the clipboard doesn't contain data, disable the paste menu item.
    // If it does contain data, decide whether you can handle the data.
    pasteItem.isEnabled = when {
        !clipboard.hasPrimaryClip() -> {
            false
        }
        !(clipboard.primaryClipDescription.hasMimeType(MIMETYPE_TEXT_PLAIN)) -> {
            // Disables the paste menu item, since the clipboard has data but it
            // isn't plain text.
            false
        }
        else -> {
            // Enables the paste menu item, since the clipboard contains plain text.
            true
        }
    }
    

    Java

    // Gets the ID of the "paste" menu item.
    MenuItem pasteItem = menu.findItem(R.id.menu_paste);
    
    // If the clipboard doesn't contain data, disable the paste menu item.
    // If it does contain data, decide whether you can handle the data.
    if (!(clipboard.hasPrimaryClip())) {
    
        pasteItem.setEnabled(false);
    
    } else if (!(clipboard.getPrimaryClipDescription().hasMimeType(MIMETYPE_TEXT_PLAIN))) {
    
        // Disables the paste menu item, since the clipboard has data but
        // it isn't plain text.
        pasteItem.setEnabled(false);
    } else {
    
        // Enables the paste menu item, since the clipboard contains plain text.
        pasteItem.setEnabled(true);
    }
    
  3. क्लिपबोर्ड से डेटा कॉपी करें. कोड के इस पॉइंट तक सिर्फ़ तब पहुंचा जा सकता है, जब "चिपकाएं" मेन्यू आइटम चालू है, ताकि आप यह मान सकें कि क्लिपबोर्ड में सामान्य टेक्स्ट है टेक्स्ट. आपको अब तक नहीं पता कि उसमें कोई टेक्स्ट स्ट्रिंग है या कोई ऐसा यूआरआई जो सामान्य टेक्स्ट पर ले जाता है. नीचे दिया गया कोड स्निपेट इसकी जांच करता है, लेकिन यह सिर्फ़ सादे टेक्स्ट को हैंडल करने के लिए कोड दिखाता है:

    Kotlin

    when (menuItem.itemId) {
        ...
        R.id.menu_paste -> {    // Responds to the user selecting "paste".
            // Examines the item on the clipboard. If getText() doesn't return null,
            // the clip item contains the text. Assumes that this application can only
            // handle one item at a time.
            val item = clipboard.primaryClip.getItemAt(0)
    
            // Gets the clipboard as text.
            pasteData = item.text
    
            return if (pasteData != null) {
                // If the string contains data, then the paste operation is done.
                true
            } else {
                // The clipboard doesn't contain text. If it contains a URI,
                // attempts to get data from it.
                val pasteUri: Uri? = item.uri
    
                if (pasteUri != null) {
                    // If the URI contains something, try to get text from it.
    
                    // Calls a routine to resolve the URI and get data from it.
                    // This routine isn't presented here.
                    pasteData = resolveUri(pasteUri)
                    true
                } else {
    
                    // Something is wrong. The MIME type was plain text, but the
                    // clipboard doesn't contain text or a Uri. Report an error.
                    Log.e(TAG,"Clipboard contains an invalid data type")
                    false
                }
            }
        }
    }
    

    Java

    // Responds to the user selecting "paste".
    case R.id.menu_paste:
    
    // Examines the item on the clipboard. If getText() does not return null,
    // the clip item contains the text. Assumes that this application can only
    // handle one item at a time.
     ClipData.Item item = clipboard.getPrimaryClip().getItemAt(0);
    
    // Gets the clipboard as text.
    pasteData = item.getText();
    
    // If the string contains data, then the paste operation is done.
    if (pasteData != null) {
        return true;
    
    // The clipboard doesn't contain text. If it contains a URI, attempts to get
    // data from it.
    } else {
        Uri pasteUri = item.getUri();
    
        // If the URI contains something, try to get text from it.
        if (pasteUri != null) {
    
            // Calls a routine to resolve the URI and get data from it.
            // This routine isn't presented here.
            pasteData = resolveUri(Uri);
            return true;
        } else {
    
            // Something is wrong. The MIME type is plain text, but the
            // clipboard doesn't contain text or a Uri. Report an error.
            Log.e(TAG, "Clipboard contains an invalid data type");
            return false;
        }
    }
    

कॉन्टेंट यूआरआई से डेटा चिपकाएं

अगर ClipData.Item ऑब्जेक्ट में कॉन्टेंट यूआरआई है और आपको लगता है कि इसके MIME टाइप का इस्तेमाल करें, ContentResolver बनाएं, और सही कॉन्टेंट को कॉल करें प्रोवाइडर तरीके का इस्तेमाल करके डेटा वापस पाया जा सकता है.

नीचे दी गई प्रक्रिया में यह बताया गया है कि कॉन्टेंट यूआरआई के आधार पर, कॉन्टेंट देने वाले से डेटा कैसे मिलेगा क्लिपबोर्ड पर. यह जांच करता है कि ऐप्लिकेशन, कंपनी.

  1. MIME टाइप शामिल करने के लिए, ग्लोबल वैरिएबल का एलान करें:

    Kotlin

    // Declares a MIME type constant to match against the MIME types offered
    // by the provider.
    const val MIME_TYPE_CONTACT = "vnd.android.cursor.item/vnd.example.contact"
    

    Java

    // Declares a MIME type constant to match against the MIME types offered by
    // the provider.
    public static final String MIME_TYPE_CONTACT = "vnd.android.cursor.item/vnd.example.contact";
    
  2. ग्लोबल क्लिपबोर्ड पाएं. कॉन्टेंट रिज़ॉल्वर भी पाएं, ताकि आप कॉन्टेंट ऐक्सेस कर सकें कंपनी:

    Kotlin

    // Gets a handle to the Clipboard Manager.
    val clipboard = getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
    
    // Gets a content resolver instance.
    val cr = contentResolver
    

    Java

    // Gets a handle to the Clipboard Manager.
    ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
    
    // Gets a content resolver instance.
    ContentResolver cr = getContentResolver();
    
  3. क्लिपबोर्ड से मुख्य क्लिप पाएं और उसका कॉन्टेंट यूआरआई के तौर पर पाएं:

    Kotlin

    // Gets the clipboard data from the clipboard.
    val clip: ClipData? = clipboard.primaryClip
    
    clip?.run {
    
        // Gets the first item from the clipboard data.
        val item: ClipData.Item = getItemAt(0)
    
        // Tries to get the item's contents as a URI.
        val pasteUri: Uri? = item.uri
    

    Java

    // Gets the clipboard data from the clipboard.
    ClipData clip = clipboard.getPrimaryClip();
    
    if (clip != null) {
    
        // Gets the first item from the clipboard data.
        ClipData.Item item = clip.getItemAt(0);
    
        // Tries to get the item's contents as a URI.
        Uri pasteUri = item.getUri();
    
  4. कॉल करके जांच करें कि यूआरआई कॉन्टेंट यूआरआई है या नहीं getType(Uri). अगर Uri किसी मान्य कॉन्टेंट प्रोवाइडर पर नहीं ले जाता, तो यह तरीका शून्य दिखाता है.

    Kotlin

        // If the clipboard contains a URI reference...
        pasteUri?.let {
    
            // ...is this a content URI?
            val uriMimeType: String? = cr.getType(it)
    

    Java

        // If the clipboard contains a URI reference...
        if (pasteUri != null) {
    
            // ...is this a content URI?
            String uriMimeType = cr.getType(pasteUri);
    
  5. जांच करें कि कॉन्टेंट देने वाला, ऐसे MIME टाइप के साथ काम करता है या नहीं जिसे ऐप्लिकेशन समझता हो. अगर आपने ठीक है, कॉल ContentResolver.query() अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है का इस्तेमाल करें. रिटर्न वैल्यू Cursor.

    Kotlin

            // If the return value isn't null, the Uri is a content Uri.
            uriMimeType?.takeIf {
    
                // Does the content provider offer a MIME type that the current
                // application can use?
                it == MIME_TYPE_CONTACT
            }?.apply {
    
                // Get the data from the content provider.
                cr.query(pasteUri, null, null, null, null)?.use { pasteCursor ->
    
                    // If the Cursor contains data, move to the first record.
                    if (pasteCursor.moveToFirst()) {
    
                        // Get the data from the Cursor here.
                        // The code varies according to the format of the data model.
                    }
    
                    // Kotlin `use` automatically closes the Cursor.
                }
            }
        }
    }
    

    Java

            // If the return value isn't null, the Uri is a content Uri.
            if (uriMimeType != null) {
    
                // Does the content provider offer a MIME type that the current
                // application can use?
                if (uriMimeType.equals(MIME_TYPE_CONTACT)) {
    
                    // Get the data from the content provider.
                    Cursor pasteCursor = cr.query(uri, null, null, null, null);
    
                    // If the Cursor contains data, move to the first record.
                    if (pasteCursor != null) {
                        if (pasteCursor.moveToFirst()) {
    
                        // Get the data from the Cursor here.
                        // The code varies according to the format of the data model.
                        }
                    }
    
                    // Close the Cursor.
                    pasteCursor.close();
                 }
             }
         }
    }
    

कोई इंटेंट चिपकाएं

इंटेंट चिपकाने के लिए, पहले ग्लोबल क्लिपबोर्ड पाएं. ClipData.Item ऑब्जेक्ट की जांच करें यह देखने के लिए कि उसमें Intent है या नहीं. इसके बाद, कॉपी करने के लिए getIntent() पर कॉल करें अपने स्टोरेज से जुड़ने की ज़रूरत नहीं होती. नीचे दिया गया स्निपेट इसे दिखाता है:

Kotlin

// Gets a handle to the Clipboard Manager.
val clipboard = getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager

// Checks whether the clip item contains an Intent by testing whether
// getIntent() returns null.
val pasteIntent: Intent? = clipboard.primaryClip?.getItemAt(0)?.intent

if (pasteIntent != null) {

    // Handle the Intent.

} else {

    // Ignore the clipboard, or issue an error if
    // you expect an Intent to be on the clipboard.
}

Java

// Gets a handle to the Clipboard Manager.
ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);

// Checks whether the clip item contains an Intent, by testing whether
// getIntent() returns null.
Intent pasteIntent = clipboard.getPrimaryClip().getItemAt(0).getIntent();

if (pasteIntent != null) {

    // Handle the Intent.

} else {

    // Ignore the clipboard, or issue an error if
    // you expect an Intent to be on the clipboard.
}

जब आपका ऐप्लिकेशन क्लिपबोर्ड डेटा ऐक्सेस करता है, तब सिस्टम से जुड़ी सूचना दिखती है

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

APP pasted from your clipboard

जब आपका ऐप्लिकेशन इनमें से कोई एक काम करता है, तो सिस्टम टोस्ट मैसेज नहीं दिखाता:

  • ऐक्सेस ClipData आपके अपने ऐप्लिकेशन से.
  • किसी खास ऐप्लिकेशन से ClipData को बार-बार ऐक्सेस करता है. टोस्ट केवल तभी दिखाई देता है जब आपका ऐप्लिकेशन उस ऐप्लिकेशन का डेटा पहली बार ऐक्सेस करता है.
  • क्लिप ऑब्जेक्ट के लिए मेटाडेटा लेता है, जैसे कि कॉल करके getPrimaryClipDescription() getPrimaryClip() के बजाय.

जटिल डेटा को कॉपी करने के लिए कॉन्टेंट देने वालों का इस्तेमाल करना

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

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

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

यूआरआई पर आइडेंटिफ़ायर को कोड में बदलें

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

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

"content://com.example.contacts"

अगर आपको इस यूआरआई पर कोई नाम कोड में बदलना है, तो नीचे दिए गए कोड स्निपेट का इस्तेमाल करें:

Kotlin

val uriString = "content://com.example.contacts/Smith"

// uriString now contains content://com.example.contacts/Smith.

// Generates a uri object from the string representation.
val copyUri = Uri.parse(uriString)

Java

String uriString = "content://com.example.contacts" + "/" + "Smith";

// uriString now contains content://com.example.contacts/Smith.

// Generates a uri object from the string representation.
Uri copyUri = Uri.parse(uriString);

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

"content://com.example.contacts/people"
"content://com.example.contacts/people/detail"
"content://com.example.contacts/people/images"

यूआरआई कॉपी करने के लिए, दूसरा पाथ जोड़ा जा सकता है:

"content://com.example.contacts/copying"

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

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

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

डेटा स्ट्रक्चर कॉपी करें

जटिल डेटा को कॉपी करके उसे सब-क्लास के रूप में चिपकाने के लिए, कॉन्टेंट देने वाले को सेट अप करें ContentProvider अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है कॉम्पोनेंट. क्लिपबोर्ड पर डाले गए यूआरआई को कोड में बदलें, ताकि यह उसी रिकॉर्ड पर पॉइंट करे जिसे आपको इंस्टॉल करना है उपलब्ध कराएँ. इसके अलावा, अपने आवेदन की मौजूदा स्थिति पर ध्यान दें:

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

कॉन्टेंट देने वाले में, कम से कम इन तरीकों को बदलें:

query()
ऐप्लिकेशन को चिपकाना यह मानकर चलता है कि वे आपके यूआरआई के साथ इस तरीके का इस्तेमाल करके आपका डेटा पा सकते हैं क्लिपबोर्ड पर रखा जाएगा. कॉपी करने की सुविधा के लिए, इस तरीके से ऐसे यूआरआई का पता लगाएं जिनमें एक खास "कॉपी करें" पाथ. इसके बाद, आपका ऐप्लिकेशन "कॉपी" बना सकता है यूआरआई क्लिपबोर्ड में कॉपी पाथ और पॉइंटर मौजूद होते हैं.
getType()
इस तरीके से, आपको उस डेटा के एमआईएमई टाइप दिखाने होंगे जिसे आपको कॉपी करना है. तरीका newUri() अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है नए ClipData में MIME टाइप को डालने के लिए, getType() को कॉल करता है ऑब्जेक्ट है.

जटिल डेटा के MIME टाइप के बारे में यहां बताया गया है कॉन्टेंट देने वाले.

आपको कॉन्टेंट देने के लिए, कॉन्टेंट देने के किसी दूसरे तरीके की ज़रूरत नहीं है. जैसे- insert() अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है या update(). चिपकाने वाले ऐप्लिकेशन को सिर्फ़ काम करने वाले MIME टाइप और मोबाइल और इंटरनेट सेवा देने वाली कंपनी से डेटा कॉपी करने की ज़रूरत होती है. अगर आपके पास ये तरीके पहले से मौजूद हैं, तो कॉपी करने की कार्रवाइयों में कोई रुकावट नहीं आएगी.

नीचे दिए गए स्निपेट में बताया गया है कि मुश्किल डेटा को कॉपी करने के लिए, अपने ऐप्लिकेशन को कैसे सेट अप करें:

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

    Kotlin

    // Declares the base URI string.
    private const val CONTACTS = "content://com.example.contacts"
    
    // Declares a path string for URIs that you use to copy data.
    private const val COPY_PATH = "/copy"
    
    // Declares a MIME type for the copied data.
    const val MIME_TYPE_CONTACT = "vnd.android.cursor.item/vnd.example.contact"
    

    Java

    // Declares the base URI string.
    private static final String CONTACTS = "content://com.example.contacts";
    
    // Declares a path string for URIs that you use to copy data.
    private static final String COPY_PATH = "/copy";
    
    // Declares a MIME type for the copied data.
    public static final String MIME_TYPE_CONTACT = "vnd.android.cursor.item/vnd.example.contact";
    
  2. उपयोगकर्ता जिस गतिविधि से डेटा कॉपी करते हैं उसमें कोड को क्लिपबोर्ड पर कॉपी करने के लिए सेट अप करें. कॉपी करने के अनुरोध के जवाब में, यूआरआई को क्लिपबोर्ड पर डाल दें.

    Kotlin

    class MyCopyActivity : Activity() {
        ...
    when(item.itemId) {
        R.id.menu_copy -> { // The user has selected a name and is requesting a copy.
            // Appends the last name to the base URI.
            // The name is stored in "lastName".
            uriString = "$CONTACTS$COPY_PATH/$lastName"
    
            // Parses the string into a URI.
            val copyUri: Uri? = Uri.parse(uriString)
    
            // Gets a handle to the clipboard service.
            val clipboard = getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
    
            val clip: ClipData = ClipData.newUri(contentResolver, "URI", copyUri)
    
            // Sets the clipboard's primary clip.
            clipboard.setPrimaryClip(clip)
        }
    }
    

    Java

    public class MyCopyActivity extends Activity {
        ...
    // The user has selected a name and is requesting a copy.
    case R.id.menu_copy:
    
        // Appends the last name to the base URI.
        // The name is stored in "lastName".
        uriString = CONTACTS + COPY_PATH + "/" + lastName;
    
        // Parses the string into a URI.
        Uri copyUri = Uri.parse(uriString);
    
        // Gets a handle to the clipboard service.
        ClipboardManager clipboard = (ClipboardManager)
            getSystemService(Context.CLIPBOARD_SERVICE);
    
        ClipData clip = ClipData.newUri(getContentResolver(), "URI", copyUri);
    
        // Sets the clipboard's primary clip.
        clipboard.setPrimaryClip(clip);
    
  3. अपने कॉन्टेंट देने वाले के ग्लोबल दायरे में, यूआरआई मैचर बनाएं और ऐसा यूआरआई पैटर्न जोड़ें जो उन यूआरआई से मेल खाता है जिन्हें आप क्लिपबोर्ड पर डालते हैं.

    Kotlin

    // A Uri Match object that simplifies matching content URIs to patterns.
    private val sUriMatcher = UriMatcher(UriMatcher.NO_MATCH).apply {
    
        // Adds a matcher for the content URI. It matches.
        // "content://com.example.contacts/copy/*"
        addURI(CONTACTS, "names/*", GET_SINGLE_CONTACT)
    }
    
    // An integer to use in switching based on the incoming URI pattern.
    private const val GET_SINGLE_CONTACT = 0
    ...
    class MyCopyProvider : ContentProvider() {
        ...
    }
    

    Java

    public class MyCopyProvider extends ContentProvider {
        ...
    // A Uri Match object that simplifies matching content URIs to patterns.
    private static final UriMatcher sURIMatcher = new UriMatcher(UriMatcher.NO_MATCH);
    
    // An integer to use in switching based on the incoming URI pattern.
    private static final int GET_SINGLE_CONTACT = 0;
    ...
    // Adds a matcher for the content URI. It matches
    // "content://com.example.contacts/copy/*"
    sUriMatcher.addURI(CONTACTS, "names/*", GET_SINGLE_CONTACT);
    
  4. सेट अप करें query() अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है तरीका. यह तरीका अलग-अलग यूआरआई पैटर्न को हैंडल कर सकता है. यह इस बात पर निर्भर करता है कि आप कोड को कैसे कोड करते हैं. हालांकि, क्लिपबोर्ड कॉपी करने की कार्रवाई दिखाने वाला पैटर्न.

    Kotlin

    // Sets up your provider's query() method.
    override fun query(
            uri: Uri,
            projection: Array<out String>?,
            selection: String?,
            selectionArgs: Array<out String>?,
            sortOrder: String?
    ): Cursor? {
        ...
        // When based on the incoming content URI:
        when(sUriMatcher.match(uri)) {
    
            GET_SINGLE_CONTACT -> {
    
                // Queries and returns the contact for the requested name. Decodes
                // the incoming URI, queries the data model based on the last name,
                // and returns the result as a Cursor.
            }
        }
        ...
    }
    

    Java

    // Sets up your provider's query() method.
    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
        String sortOrder) {
        ...
        // Switch based on the incoming content URI.
        switch (sUriMatcher.match(uri)) {
    
        case GET_SINGLE_CONTACT:
    
            // Queries and returns the contact for the requested name. Decodes the
            // incoming URI, queries the data model based on the last name, and
            // returns the result as a Cursor.
        ...
    }
    
  5. getType() तरीका सेट अप करें, ताकि कॉपी किए जाने वाले एमआईएमई टाइप का डेटा दिखाया जा सके डेटा:

    Kotlin

    // Sets up your provider's getType() method.
    override fun getType(uri: Uri): String? {
        ...
        return when(sUriMatcher.match(uri)) {
            GET_SINGLE_CONTACT -> MIME_TYPE_CONTACT
            ...
        }
    }
    

    Java

    // Sets up your provider's getType() method.
    public String getType(Uri uri) {
        ...
        switch (sUriMatcher.match(uri)) {
        case GET_SINGLE_CONTACT:
            return (MIME_TYPE_CONTACT);
        ...
        }
    }
    

कॉन्टेंट यूआरआई से डेटा चिपकाएं सेक्शन में बताया गया है कि कॉन्टेंट यूआरआई को क्लिपबोर्ड से सेव किया है और डेटा पाने और चिपकाने के लिए इसका इस्तेमाल किया है.

डेटा स्ट्रीम कॉपी करें

बड़ी संख्या में टेक्स्ट और बाइनरी डेटा को स्ट्रीम के तौर पर कॉपी करके चिपकाया जा सकता है. डेटा में फ़ॉर्म हो सकते हैं जैसे:

  • डिवाइस में सेव की गई फ़ाइलें
  • सॉकेट से स्ट्रीम
  • सेवा देने वाली कंपनी के डेटाबेस सिस्टम में बहुत ज़्यादा डेटा सेव किया गया है

डेटा स्ट्रीम के लिए कॉन्टेंट उपलब्ध कराने वाला कोई व्यक्ति, फ़ाइल डिस्क्रिप्टर ऑब्जेक्ट की मदद से अपने डेटा को ऐक्सेस करता है, जैसे कि AssetFileDescriptor, के बजाय Cursor ऑब्जेक्ट का इस्तेमाल कर सकते हैं. चिपकाने वाला ऐप्लिकेशन, इसका इस्तेमाल करके डेटा स्ट्रीम को पढ़ता है फ़ाइल डिस्क्रिप्टर शामिल है.

अगर आपको किसी कंपनी की डेटा स्ट्रीम कॉपी करने के लिए, अपना ऐप्लिकेशन सेट अप करना है, तो यह तरीका अपनाएं:

  1. क्लिपबोर्ड पर डाली जा रही डेटा स्ट्रीम के लिए, कॉन्टेंट यूआरआई सेट अप करें. विकल्प इसके लिए आपको ये काम करने होंगे:
    • डेटा स्ट्रीम के लिए, एक आइडेंटिफ़ायर को यूआरआई पर एन्कोड करें, जैसा कि यूआरआई सेक्शन में आइडेंटिफ़ायर को कोड में बदलें सेक्शन टेबल में, स्ट्रीम करने के लिए इस्तेमाल किए गए आइडेंटिफ़ायर और उससे जुड़ी स्ट्रीम का नाम शामिल करें.
    • स्ट्रीम के नाम को सीधे यूआरआई पर एन्कोड करें.
    • ऐसे यूनीक यूआरआई का इस्तेमाल करें जो सेवा देने वाली कंपनी से मिली मौजूदा स्ट्रीम को हमेशा दिखाता हो. अगर आपको इस विकल्प का इस्तेमाल करें, तो अपने प्रोवाइडर को किसी दूसरी स्ट्रीम पर ले जाने के लिए इसे अपडेट करना न भूलें तो यूआरआई का इस्तेमाल करके क्लिपबोर्ड पर स्ट्रीम को कॉपी किया जाएगा.
  2. आपको जो डेटा स्ट्रीम ऑफ़र करनी है उसके हर टाइप के लिए, MIME टाइप दें. ऐप्लिकेशन पेस्ट किए जा रहे हैं को यह तय करने के लिए इस जानकारी की ज़रूरत है कि वे क्लिपबोर्ड पर डेटा चिपका सकते हैं या नहीं.
  3. ContentProvider के तरीकों में से किसी एक को लागू करें, जो फ़ाइल डिस्क्रिप्टर दिखाता है स्ट्रीम. अगर कॉन्टेंट यूआरआई पर आइडेंटिफ़ायर को कोड में बदला जाता है, तो इस तरीके का इस्तेमाल करके यह तय करें कि स्ट्रीम करना है.
  4. डेटा स्ट्रीम को क्लिपबोर्ड पर कॉपी करने के लिए, कॉन्टेंट का यूआरआई बनाएं और उसे क्लिपबोर्ड.

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

नीचे दी गई सूची में, कॉन्टेंट देने वाले के लिए फ़ाइल डिस्क्रिप्टर के सबसे अहम तरीके दिखाए गए हैं. हर इनमें से एक ContentResolver तरीका स्ट्रिंग के साथ "जानकारी देने वाला" मेथड के नाम के साथ जुड़ा हुआ है. उदाहरण के लिए, ContentResolver इसका ऐनालॉग openAssetFile() इससे मेल खाता है openAssetFileDescriptor().

openTypedAssetFile()

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

इस तरीके में, फ़ाइलों के सब-सेक्शन मैनेज किए जाते हैं. इसका इस्तेमाल उन ऐसेट को पढ़ने के लिए किया जा सकता है जिन्हें कॉन्टेंट देने वाले ने क्लिपबोर्ड पर कॉपी कर दिया है.

openAssetFile()
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है यह openTypedAssetFile() का ज़्यादा सामान्य तरीका है. यह फ़िल्टर नहीं लगाया जाता का इस्तेमाल किया जा सकता है, लेकिन यह फ़ाइलों के सब-सेक्शन को पढ़ सकता है.
openFile()
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है यह openAssetFile() का ज़्यादा सामान्य रूप है. यह इसके सब-सेक्शन को नहीं पढ़ सकता फ़ाइलें शामिल हैं.

आप वैकल्पिक रूप से openPipeHelper() अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है विधि को सेट अप करें. इससे चिपकाने वाला ऐप्लिकेशन, स्ट्रीम डेटा को पाइप का इस्तेमाल करके बनाया गया बैकग्राउंड थ्रेड. इस तरीके का इस्तेमाल करने के लिए, ContentProvider.PipeDataWriter अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है इंटरफ़ेस पर कॉपी करने की सुविधा मिलती है.

कॉपी करने और चिपकाने का असरदार फ़ंक्शन डिज़ाइन करें

अपने ऐप्लिकेशन के लिए कॉपी-पेस्ट करने की असरदार सुविधा डिज़ाइन करने के लिए, इन बातों को याद रखें:

  • क्लिपबोर्ड पर किसी भी समय सिर्फ़ एक क्लिप होती है. किसी भी डोमेन के ज़रिए कॉपी करने पर तो सिस्टम में पिछली क्लिप को ओवरराइट कर देता है. क्योंकि उपयोगकर्ता अपने ऐप्लिकेशन से दूर रहने और वापस लौटने से पहले कॉपी करने के बाद, आप क्लिपबोर्ड को उसमें वह क्लिप शामिल हो जिसे उपयोगकर्ता ने आपके ऐप्लिकेशन में पहले कॉपी किया था.
  • हर क्लिप में एक से ज़्यादा ClipData.Item ऑब्जेक्ट जोड़ने का मकसद यह है के अलग-अलग रूपों के बजाय एक से अधिक चयनों को कॉपी और पेस्ट करने का संदर्भ होता है. आम तौर पर, आपको ClipData.Item की सभी सुविधाएं चाहिए किसी क्लिप में मौजूद ऑब्जेक्ट के बारे में बताती हैं. इसका मतलब है कि वे सभी आसान टेक्स्ट, कॉन्टेंट वाले होने चाहिए यूआरआई या Intent, और मिक्स नहीं किए गए हैं.
  • डेटा मुहैया कराते समय, अलग-अलग एमआईएमई का इस्तेमाल किया जा सकता है. MIME टाइप जोड़ें आप ClipDescription का इस्तेमाल करते हैं और फिर MIME टाइप को कॉन्टेंट देने वाला है.
  • जब आपको क्लिपबोर्ड से डेटा मिलता है, तो यह देखना आपका ऐप्लिकेशन होता है कि वह MIME टाइप का इस्तेमाल करें. इसके बाद, तय करें कि किस MIME टाइप का इस्तेमाल करना है. भले ही कोई क्लिपबोर्ड पर क्लिप मौजूद है और उपयोगकर्ता, चिपकाने का अनुरोध कर रहा है, तो इसके लिए आपको ऐप्लिकेशन की ज़रूरत नहीं है चिपकाने के लिए. अगर MIME टाइप काम करता है, तो मैसेज चिपकाएं. डेटा के साथ छेड़छाड़ की जा सकती है क्लिपबोर्ड पर coerceToText() का इस्तेमाल करके मैसेज भेजें. अगर आपका ऐप्लिकेशन समर्थन करता है का विकल्प चुनने पर, उपयोगकर्ता को यह चुनने की अनुमति दी जा सकती है कि उसे किस MIME टाइप का इस्तेमाल करना है.