সমৃদ্ধ বিষয়বস্তু গ্রহণ

চিত্র ১. ইউনিফাইড API নির্দিষ্ট UI প্রক্রিয়া নির্বিশেষে আগত সামগ্রী পরিচালনা করার জন্য একটি একক স্থান প্রদান করে, যেমন টাচ অ্যান্ড হোল্ড মেনু থেকে পেস্ট করা বা ড্র্যাগ-এন্ড-ড্রপ ব্যবহার করা।

ব্যবহারকারীরা ছবি, ভিডিও এবং অন্যান্য অভিব্যক্তিপূর্ণ কন্টেন্ট পছন্দ করেন, কিন্তু অ্যাপগুলিতে এই কন্টেন্ট সন্নিবেশ করা এবং সরানো সবসময় সহজ নয়। অ্যাপগুলির জন্য সমৃদ্ধ কন্টেন্ট গ্রহণ করা সহজ করার জন্য, Android 12 (API লেভেল 31) একটি ইউনিফাইড API প্রবর্তন করে যা আপনার অ্যাপকে যেকোনো উৎস থেকে কন্টেন্ট গ্রহণ করতে দেয়: ক্লিপবোর্ড, কীবোর্ড, অথবা টেনে আনা।

আপনি UI কম্পোনেন্টের সাথে OnReceiveContentListener এর মতো একটি ইন্টারফেস সংযুক্ত করতে পারেন এবং যেকোনো মেকানিজমের মাধ্যমে কন্টেন্ট সন্নিবেশ করালে কলব্যাক পেতে পারেন। কলব্যাক আপনার কোডের জন্য প্লেইন এবং স্টাইল করা টেক্সট থেকে শুরু করে মার্কআপ, ছবি, ভিডিও, অডিও ফাইল এবং অন্যান্য সমস্ত কন্টেন্ট গ্রহণের একক জায়গা হয়ে ওঠে।

পূর্ববর্তী অ্যান্ড্রয়েড সংস্করণগুলির সাথে ব্যাকওয়ার্ড সামঞ্জস্যের জন্য, এই APIটি AndroidX-এও উপলব্ধ, যা Core 1.7 এবং Appcompat 1.4 থেকে শুরু হয়, যা আমরা আপনাকে এই কার্যকারিতা বাস্তবায়নের সময় ব্যবহার করার পরামর্শ দিচ্ছি।

সংক্ষিপ্ত বিবরণ

অন্যান্য বিদ্যমান API-এর ক্ষেত্রে, প্রতিটি UI মেকানিজম—যেমন টাচ অ্যান্ড হোল্ড মেনু বা ড্র্যাগিং—এর নিজস্ব সংশ্লিষ্ট API থাকে। এর অর্থ হল আপনাকে প্রতিটি API-এর সাথে আলাদাভাবে ইন্টিগ্রেট করতে হবে, প্রতিটি মেকানিজমের জন্য একই কোড যোগ করতে হবে যা কন্টেন্ট সন্নিবেশ করায়:

বিভিন্ন ক্রিয়া এবং বাস্তবায়নের জন্য আপেক্ষিক API দেখানো একটি ছবি
চিত্র ২। পূর্বে, অ্যাপগুলি প্রতিটি UI প্রক্রিয়ার জন্য কন্টেন্ট সন্নিবেশ করার জন্য একটি ভিন্ন API প্রয়োগ করত।

OnReceiveContentListener API এই বিভিন্ন কোড পাথগুলিকে একত্রিত করে একটি একক API তৈরি করে বাস্তবায়ন করে, যাতে আপনি আপনার অ্যাপ-নির্দিষ্ট লজিকের উপর ফোকাস করতে পারেন এবং প্ল্যাটফর্মটিকে বাকিটা পরিচালনা করতে দিতে পারেন:

সরলীকৃত ইউনিফাইড API দেখানো একটি ছবি
চিত্র ৩. ইউনিফাইড API আপনাকে একটি একক API বাস্তবায়ন করতে দেয় যা সমস্ত UI প্রক্রিয়া সমর্থন করে।

এই পদ্ধতির অর্থ হল যখন প্ল্যাটফর্মে কন্টেন্ট সন্নিবেশ করার নতুন উপায় যোগ করা হয়, তখন আপনার অ্যাপে সমর্থন সক্ষম করার জন্য অতিরিক্ত কোড পরিবর্তন করার প্রয়োজন হয় না। এবং যদি আপনার অ্যাপটিকে কোনও নির্দিষ্ট ব্যবহারের ক্ষেত্রে সম্পূর্ণ কাস্টমাইজেশন বাস্তবায়নের প্রয়োজন হয়, আপনি এখনও বিদ্যমান API গুলি ব্যবহার করতে পারেন, যা একইভাবে কাজ করে।

বাস্তবায়ন

API হল একটি শ্রোতা ইন্টারফেস যার একটি একক পদ্ধতি, OnReceiveContentListener । অ্যান্ড্রয়েড প্ল্যাটফর্মের পুরোনো সংস্করণগুলিকে সমর্থন করার জন্য, আমরা AndroidX কোর লাইব্রেরিতে মিলিত OnReceiveContentListener ইন্টারফেস ব্যবহার করার পরামর্শ দিচ্ছি।

API ব্যবহার করতে, আপনার অ্যাপ কোন ধরণের কন্টেন্ট পরিচালনা করতে পারে তা নির্দিষ্ট করে শ্রোতা বাস্তবায়ন করুন:

কোটলিন

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 ধরণের কন্টেন্ট নির্দিষ্ট করার পরে, বাকি শ্রোতাদের বাস্তবায়ন করুন:

কোটলিন

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

যদি আপনার অ্যাপটি ইতিমধ্যেই ইনটেন্টের সাথে শেয়ারিং সমর্থন করে, তাহলে আপনি কন্টেন্ট URI পরিচালনার জন্য আপনার অ্যাপ-নির্দিষ্ট লজিক পুনরায় ব্যবহার করতে পারেন। প্ল্যাটফর্মে সেই ডেটা পরিচালনা করার জন্য অবশিষ্ট যেকোনো ডেটা ফেরত দিন।

লিসেনার বাস্তবায়নের পর, এটি আপনার অ্যাপের উপযুক্ত UI উপাদানগুলিতে সেট করুন:

কোটলিন

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 এ প্রেরিত পেলোডের যেকোনো কন্টেন্ট URI-এর জন্য প্ল্যাটফর্ম স্বয়ংক্রিয়ভাবে পড়ার অনুমতি প্রদান করে এবং প্রকাশ করে।

সাধারণত, আপনার অ্যাপ কোনও পরিষেবা বা কার্যকলাপে কন্টেন্ট URI প্রক্রিয়া করে। দীর্ঘমেয়াদী প্রক্রিয়াকরণের জন্য, 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 হলে super-এ ডেলিগেট করুন।

কীবোর্ড ইমেজ API এর সাথে তুলনা

আপনি OnReceiveContentListener API কে বিদ্যমান কীবোর্ড ইমেজ API এর পরবর্তী সংস্করণ হিসেবে ভাবতে পারেন। এই ইউনিফাইড API কীবোর্ড ইমেজ API এর কার্যকারিতার পাশাপাশি কিছু অতিরিক্ত বৈশিষ্ট্য সমর্থন করে। ডিভাইস এবং বৈশিষ্ট্যের সামঞ্জস্যতা আপনি Jetpack লাইব্রেরি ব্যবহার করেন নাকি Android SDK থেকে নেটিভ API ব্যবহার করেন তার উপর নির্ভর করে পরিবর্তিত হয়।

সারণি ১. জেটপ্যাকের জন্য সমর্থিত বৈশিষ্ট্য এবং API স্তর।
অ্যাকশন বা বৈশিষ্ট্য কীবোর্ড ইমেজ API দ্বারা সমর্থিত ইউনিফাইড এপিআই দ্বারা সমর্থিত
কীবোর্ড থেকে ঢোকান হ্যাঁ (API লেভেল ১৩ এবং তার বেশি) হ্যাঁ (API লেভেল ১৩ এবং তার বেশি)
টাচ অ্যান্ড হোল্ড মেনু থেকে পেস্ট ব্যবহার করে ঢোকান না হাঁ
টেনে এনে ফেলে দিন ব্যবহার করে সন্নিবেশ করান না হ্যাঁ (API লেভেল ২৪ এবং তার বেশি)
সারণী ২। নেটিভ API-এর জন্য সমর্থিত বৈশিষ্ট্য এবং API স্তর।
অ্যাকশন বা বৈশিষ্ট্য কীবোর্ড ইমেজ API দ্বারা সমর্থিত ইউনিফাইড এপিআই দ্বারা সমর্থিত
কীবোর্ড থেকে ঢোকান হ্যাঁ (API লেভেল ২৫ এবং তার বেশি) হ্যাঁ (অ্যান্ড্রয়েড ১২ এবং উচ্চতর)
টাচ অ্যান্ড হোল্ড মেনু থেকে পেস্ট ব্যবহার করে ঢোকান না
টেনে এনে ফেলে দিন ব্যবহার করে ঢোকান না