ব্যবহারকারীরা ছবি, ভিডিও এবং অন্যান্য অভিব্যক্তিপূর্ণ বিষয়বস্তু পছন্দ করে, কিন্তু অ্যাপে এই বিষয়বস্তু ঢোকানো এবং সরানো সবসময় সহজ নয়। অ্যাপ্লিকেশানগুলির জন্য সমৃদ্ধ সামগ্রী প্রাপ্ত করা সহজতর করতে, Android 12 (API স্তর 31) একটি ইউনিফাইড API প্রবর্তন করে যা আপনার অ্যাপকে যে কোনও উত্স থেকে সামগ্রী গ্রহণ করতে দেয়: ক্লিপবোর্ড, কীবোর্ড বা টেনে আনা৷
আপনি একটি ইন্টারফেস সংযুক্ত করতে পারেন, যেমন OnReceiveContentListener
, UI উপাদানগুলিতে এবং একটি কলব্যাক পেতে পারেন যখন কোনও প্রক্রিয়ার মাধ্যমে সামগ্রী ঢোকানো হয়৷ প্লেইন এবং স্টাইল করা টেক্সট থেকে মার্কআপ, ছবি, ভিডিও, অডিও ফাইল এবং অন্যান্য সমস্ত বিষয়বস্তু গ্রহণ করার জন্য কলব্যাক আপনার কোডের জন্য একক স্থান হয়ে ওঠে।
পূর্ববর্তী Android সংস্করণগুলির সাথে পিছিয়ে থাকা সামঞ্জস্যের জন্য, এই APIটি AndroidX-এও উপলব্ধ, Core 1.7 এবং Appcompat 1.4 থেকে শুরু করে, যা আমরা এই কার্যকারিতা বাস্তবায়ন করার সময় আপনাকে ব্যবহার করার পরামর্শ দিই৷
ওভারভিউ
অন্যান্য বিদ্যমান API-এর সাথে, প্রতিটি UI প্রক্রিয়া-যেমন টাচ অ্যান্ড হোল্ড মেনু বা টেনে আনা-এর নিজস্ব সংশ্লিষ্ট API রয়েছে। এর মানে হল যে আপনাকে প্রতিটি API এর সাথে আলাদাভাবে সংহত করতে হবে, প্রতিটি মেকানিজমের জন্য অনুরূপ কোড যোগ করে যা সামগ্রী সন্নিবেশ করে:
OnReceiveContentListener
API বাস্তবায়নের জন্য একটি একক API তৈরি করে এই বিভিন্ন কোড পাথগুলিকে একীভূত করে, যাতে আপনি আপনার অ্যাপ-নির্দিষ্ট যুক্তিতে ফোকাস করতে পারেন এবং প্ল্যাটফর্মটিকে বাকিগুলি পরিচালনা করতে দিতে পারেন:
এই পদ্ধতির মানে হল যে যখন প্ল্যাটফর্মে বিষয়বস্তু সন্নিবেশ করার নতুন উপায় যোগ করা হয়, তখন আপনার অ্যাপে সমর্থন সক্ষম করতে আপনাকে অতিরিক্ত কোড পরিবর্তন করতে হবে না। এবং যদি আপনার অ্যাপকে একটি নির্দিষ্ট ব্যবহারের ক্ষেত্রে সম্পূর্ণ কাস্টমাইজেশন প্রয়োগ করতে হয়, আপনি এখনও বিদ্যমান 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<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()); } }
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 ব্যবহার করছেন কিনা তার উপর নির্ভর করে ডিভাইস এবং বৈশিষ্ট্যের সামঞ্জস্যতা পরিবর্তিত হয়।
কর্ম বা বৈশিষ্ট্য | কীবোর্ড ইমেজ API দ্বারা সমর্থিত | ইউনিফাইড API দ্বারা সমর্থিত |
---|---|---|
কীবোর্ড থেকে ঢোকান | হ্যাঁ (API স্তর 13 এবং উচ্চতর) | হ্যাঁ (API স্তর 13 এবং উচ্চতর) |
টাচ অ্যান্ড হোল্ড মেনু থেকে পেস্ট ব্যবহার করে সন্নিবেশ করুন | না | হ্যাঁ |
ড্র্যাগ-এন্ড-ড্রপ ব্যবহার করে সন্নিবেশ করুন | না | হ্যাঁ (API স্তর 24 এবং উচ্চতর) |
কর্ম বা বৈশিষ্ট্য | কীবোর্ড ইমেজ API দ্বারা সমর্থিত | ইউনিফাইড API দ্বারা সমর্থিত |
---|---|---|
কীবোর্ড থেকে ঢোকান | হ্যাঁ (API স্তর 25 এবং উচ্চতর) | হ্যাঁ (Android 12 এবং উচ্চতর) |
টাচ অ্যান্ড হোল্ড মেনু থেকে পেস্ট ব্যবহার করে সন্নিবেশ করুন | না | |
ড্র্যাগ এবং ড্রপ ব্যবহার করে সন্নিবেশ করুন | না |