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

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

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

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

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

ওভারভিউ

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

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

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

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

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

বাস্তবায়ন

API হল একটি শ্রোতা ইন্টারফেস যার একটি একক পদ্ধতি, OnReceiveContentListener । Android প্ল্যাটফর্মের পুরানো সংস্করণগুলিকে সমর্থন করার জন্য, আমরা 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 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());
     }
}

URI অনুমতি

OnReceiveContentListener এর কাছে পাঠানো পেলোডে থাকা যেকোনো বিষয়বস্তুর 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 হয় তখন সুপারে অর্পণ করুন।

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

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

সারণি 1. জেটপ্যাকের জন্য সমর্থিত বৈশিষ্ট্য এবং API স্তর।
কর্ম বা বৈশিষ্ট্য কীবোর্ড ইমেজ API দ্বারা সমর্থিত ইউনিফাইড API দ্বারা সমর্থিত
কীবোর্ড থেকে ঢোকান হ্যাঁ (API স্তর 13 এবং উচ্চতর) হ্যাঁ (API স্তর 13 এবং উচ্চতর)
টাচ অ্যান্ড হোল্ড মেনু থেকে পেস্ট ব্যবহার করে সন্নিবেশ করুন না হ্যাঁ
ড্র্যাগ-এন্ড-ড্রপ ব্যবহার করে সন্নিবেশ করুন না হ্যাঁ (API স্তর 24 এবং উচ্চতর)
সারণী 2. সমর্থিত বৈশিষ্ট্য এবং স্থানীয় API-এর জন্য API স্তর।
কর্ম বা বৈশিষ্ট্য কীবোর্ড ইমেজ API দ্বারা সমর্থিত ইউনিফাইড API দ্বারা সমর্থিত
কীবোর্ড থেকে ঢোকান হ্যাঁ (API স্তর 25 এবং উচ্চতর) হ্যাঁ (Android 12 এবং উচ্চতর)
টাচ অ্যান্ড হোল্ড মেনু থেকে পেস্ট ব্যবহার করে সন্নিবেশ করুন না
ড্র্যাগ এবং ড্রপ ব্যবহার করে সন্নিবেশ করুন না