অন্যান্য অ্যাপ থেকে ডেটা পান

একটি অ্যাপ যেমন অন্য অ্যাপে ডেটা পাঠাতে পারে, তেমনই অন্য অ্যাপ থেকেও ডেটা গ্রহণ করতে পারে। ব্যবহারকারীরা আপনার অ্যাপ্লিকেশনের সাথে কীভাবে ইন্টার‍্যাক্ট করেন এবং আপনি অন্যান্য অ্যাপ্লিকেশন থেকে কী ধরনের ডেটা পেতে চান তা বিবেচনা করুন। যেমন, কোনও সোশ্যাল নেটওয়ার্কিং অ্যাপ্লিকেশন অন্য অ্যাপ থেকে টেক্সট কন্টেন্ট, যেমন কোনও আকর্ষণীয় ওয়েব URL পেতে আগ্রহী হতে পারে।

Compose Navigation ব্যবহার করা কোনও অ্যাপে, অন্য অ্যাপের পাঠানো ডেটা রিসিভ করার প্রসেসটি তিনটি ধাপে সম্পন্ন হয়:

  1. ম্যানিফেস্টে <intent-filter> ঘোষণা করুন: আপনাকে এখনও AndroidManifest.xml ফাইলে আপনার অ্যাক্টিভিটিতে একটি ইনটেন্ট ফিল্টার যোগ করতে হবে। এটি Android OS-কে জানায় যে আপনার অ্যাপ্লিকেশন নির্দিষ্ট অ্যাকশন (যেমন ACTION_SEND) এবং MIME-এর প্রকার (যেমন text/plain) গ্রহণ করতে সক্ষম।

  2. আপনার Compose Navigation গ্রাফে একটি navDeepLink সংজ্ঞায়িত করুন: অ্যাকশন এবং MIME-এর প্রকারের সাথে সরাসরি মেলে এমন একটি navDeepLink কম্পোজেবল গন্তব্যের সাথে অ্যাটাচ করুন যা কন্টেন্ট দেখাবে। NavController অটোমেটিক ইনকামিং ইনটেন্ট ইন্টারসেপ্ট করে এবং ব্যবহারকারীকে সরাসরি সেই স্ক্রিনে নিয়ে যায়।

  3. ইনকামিং ডেটা পেলোড এক্সট্র্যাক্ট করুন: আপনার ডেস্টিনেশন স্ক্রিনে, শেয়ার করা কন্টেন্ট ফিরিয়ে আনতে ইনটেন্ট এক্সট্রা (যেমন EXTRA_TEXT বা EXTRA_STREAM) অ্যাক্সেস করুন এবং আপনার UI স্ট্যাটাস আপডেট করুন।

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

MIME-এর প্রকার কাজ করে

সাধারণত, কোনও অ্যাপকে MIME-এর প্রকারের সম্ভাব্য সর্বাধিক রেঞ্জ গ্রহণ করতে পারতে হবে। যেমন, টেক্সট, ছবি ও ভিডিও পাঠানোর জন্য ডিজাইন করা মেসেজিং অ্যাপ text/*, image/* ও video/* রিসিভ করার জন্য উপযুক্ত। Android-এ ডেটা পাঠানো ও পাওয়ার জন্য এখানে কয়েকটি সাধারণ MIME-এর প্রকার দেওয়া হল।

প্রাপক এর জন্য রেজিস্টার করেন প্রেরক পাঠান
text/*
  • text/plain
  • text/rtf
  • text/html
  • text/json
image/*
  • image/jpg
  • image/png
  • image/gif
video/*
  • video/mp4
  • video/3gp
এই ধরনের ফাইল এক্সটেনশন কাজ করে application/pdf

MIME মিডিয়া টাইপের IANA অফিসিয়াল রেজিস্ট্রি দেখুন।

শেয়ার করার জন্য দারুণ টার্গেট তৈরি করুন

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

আপনার অ্যাপে ডেটা রিসিভ করুন

Compose ব্যবহার করে কোনও অ্যাপে শেয়ার করা ডেটা পাওয়ার জন্য আপনার ম্যানিফেস্টে ইনটেন্ট ফিল্টার ঘোষণা করতে হয়, ডিপ লিঙ্কের মাধ্যমে ইনকামিং ইনটেন্টকে সঠিক স্ক্রিনে পাঠাতে হয় এবং আপনার UI আপডেট করার জন্য ইনটেন্ট থেকে পেলোড এক্সট্র্যাক্ট করতে হয়।

আপনার ম্যানিফেস্ট আপডেট করুন

ইনটেন্ট ফিল্টার সিস্টেমকে জানায় যে অ্যাপের কোন কম্পোনেন্ট ইনটেন্ট গ্রহণ করে। অন্যান্য অ্যাপে ডেটা পাঠানো লেসনে ACTION_SEND অ্যাকশনের মাধ্যমে আপনি যেভাবে ইনটেন্ট তৈরি করেছেন, ঠিক সেইভাবেই এই অ্যাকশনের মাধ্যমে ইনটেন্ট পাওয়ার জন্য আপনি ইনটেন্ট ফিল্টার তৈরি করেন। আপনি <intent-filter> এলিমেন্ট ব্যবহার করে আপনার ম্যানিফেস্টে ইনটেন্ট ফিল্টার নির্ধারণ করেন। যেমন, আপনার অ্যাপ টেক্সট কন্টেন্ট রিসিভ করার কাজ করলে, যেকোনও ধরনের এক বা একাধিক ছবি সহ ম্যানিফেস্ট নিচের স্নিপেটের মতো দেখতে হবে:

<activity android:name=".ui.MyActivity" android:exported="true">
    <intent-filter>
        <action android:name="android.intent.action.SEND" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:mimeType="image/*" />
    </intent-filter>
    <intent-filter>
        <action android:name="android.intent.action.SEND" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:mimeType="text/plain" />
    </intent-filter>
    <intent-filter>
        <action android:name="android.intent.action.SEND_MULTIPLE" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:mimeType="image/*" />
    </intent-filter>
</activity>

অন্য কোনও অ্যাপ ইনটেন্ট তৈরি করে এবং startActivity()-এ পাস করে এর মধ্যে যেকোনও কিছু শেয়ার করার চেষ্টা করলে, আপনার অ্যাপ্লিকেশন Android শেয়ারশিট বা ইনটেন্ট রিজলভারে বিকল্প হিসেবে তালিকাভুক্ত হয়। ব্যবহারকারী আপনার অ্যাপ বেছে নিলে, এটি সংশ্লিষ্ট অ্যাক্টিভিটি শুরু করে (আগের উদাহরণে .ui.MyActivity)। তারপর আপনার কোড ও UI-এর মধ্যে কন্টেন্ট সঠিকভাবে ম্যানেজ করার দায়িত্ব আপনার।

Compose নেভিগেশনে, সরাসরি কম্পোজেবল ডেস্টিনেশনে navDeepLink অ্যাটাচ করুন যা কন্টেন্ট দেখাবে। অন্য কোনও অ্যাপ আপনার ইনটেন্ট ফিল্টারের সাথে মেলে এমন ডেটা শেয়ার করলে, Compose Navigation ব্যবহারকারীকে সরাসরি এই গন্তব্যে নিয়ে যায়:

সঠিক গন্তব্য স্ক্রিনে নেভিগেট করার জন্য ইনকামিং ইনটেন্টের অ্যাকশন এবং MIME-এর প্রকারের সাথে navDeepLink ম্যাচ করে। সেই গন্তব্যে পৌঁছানোর পরে, আপনার হ্যান্ডলার কোন পেলোডটি রিসিভ করা হয়েছে তা নির্ধারণ করতে ইনটেন্টটি পরীক্ষা করে (যেমন একটি ছবি বনাম একাধিক ছবি) এবং সংশ্লিষ্ট অতিরিক্তগুলি এক্সট্র্যাক্ট করে।

ইনকামিং কন্টেন্ট ম্যানেজ করা

Intent-এর মাধ্যমে ডেলিভার করা কন্টেন্ট ফিরিয়ে আনতে, আপনার কম্পোজেবল থেকে LocalActivity.current-এর বর্তমান অ্যাক্টিভিটি পড়ুন, তারপর ইনটেন্ট পরীক্ষা করে দেখুন যে এর পরে কী করতে হবে। এই অ্যাক্টিভিটি যদি সিস্টেমের অন্যান্য অংশ (যেমন লঞ্চার) থেকে শুরু করা যায়, তাহলে ইনটেন্ট পরীক্ষা করার সময় এটি বিবেচনা করুন।

ইনকামিং ডেটা চেক করার সময় অতিরিক্ত সতর্কতা অবলম্বন করুন: ভুল MIME-এর ধরন সেট করা থাকতে পারে অথবা পাঠানো ছবি অত্যন্ত বড় হতে পারে। বাইনারি ডেটা বা ভারী I/O অপারেশন (যেমন বড় ছবি ডিকোড করা বা ফাইল লেখা) অ্যাসিঙ্ক্রোনাসভাবে প্রসেস করুন মূল UI থ্রেডের পরিবর্তে কোরুটিন (যেমন Dispatchers.IO) ব্যবহার করে।

@Composable
fun SharesheetHandler() {
    val activity = LocalActivity.current
    val intent = activity?.intent

    when (intent?.action) {
        Intent.ACTION_SEND -> {
            if (intent.type == "text/plain") {
                handleSendText(intent) // Handle text being sent
            } else if (intent.type?.startsWith("image/") == true) {
                handleSendImage(intent) // Handle single image being sent
            }
        }

        Intent.ACTION_SEND_MULTIPLE -> {
            if (intent.type?.startsWith("image/") == true) {
                handleSendMultipleImages(intent) // Handle multiple images being sent
            }
        }

        else -> {
            // Handle other intents, such as being started from the home screen
        }
    }
}

private fun handleSendText(intent: Intent) {
    intent.getStringExtra(Intent.EXTRA_TEXT)?.let {
        // Update UI state with the shared text
    }
}

private fun handleSendImage(intent: Intent) {
    val imageUri = IntentCompat.getParcelableExtra(intent, Intent.EXTRA_STREAM, Uri::class.java)
    imageUri?.let {
        // Update UI state with the shared image
    }
}

private fun handleSendMultipleImages(intent: Intent) {
    val imageUris =
        IntentCompat.getParcelableArrayListExtra(intent, Intent.EXTRA_STREAM, Uri::class.java)
    imageUris?.let {
        // Update UI state with the shared images
    }
}

ইনটেন্ট এক্সট্রা (যেমন EXTRA_STREAM) থেকে বাইনারি ডেটা বা URI এক্সট্র্যাক্ট করার সময়, AndroidX Core লাইব্রেরি থেকে IntentCompat.getParcelableExtra() বা IntentCompat.getParcelableArrayListExtra() ব্যবহার করুন, যেমনটি পূর্ববর্তী handleSendImage এবং handleSendMultipleImages ফাংশনে দেখানো হয়েছে। Android 13 (API লেভেল 33) ভার্সনে প্যারামিটারাইজ না করা Intent.getParcelableExtra(String) পদ্ধতিকে বাদ দিয়ে টাইপ-সেফ পদ্ধতি ব্যবহার করা হয় যা প্রত্যাশিত ক্লাস টাইপ গ্রহণ করে।

ডেটা পাওয়ার পরে UI আপডেট করা, TextField-এ ডেটা দেখানোর জন্য স্ট্যাটাস আপডেট করার মতোই সহজ হতে পারে অথবা কোনও ছবিতে ফিল্টার প্রয়োগ করার মতোই জটিল হতে পারে। এরপর কী হবে তা আপনার অ্যাপের উপর নির্ভর করে।

স্ক্রিনশট URL শেয়ার করা

স্ক্রিনশট নেওয়ার সময়, আপনি স্ক্রিনশট এবং যেকোনও সংশ্লিষ্ট URL শেয়ার করতে পারবেন। এটি ব্যবহারকারীকে আরও ভালো অভিজ্ঞতা প্রদান করে। URL পাওয়ার সময়, ইনটেন্ট থেকে EXTRA_TEXT ফিল্ড পেতে ভুলবেন না, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

IntentCompat.getParcelableExtra(intent, Intent.EXTRA_STREAM, Uri::class.java).let {
    // Handle the EXTRA_TEXT as well
    val extraText = intent.getCharSequenceExtra(Intent.EXTRA_TEXT)
    // Update UI state with the shared image and the EXTRA_TEXT if available
}

ব্যবহারকারীরা যাতে আপনার অ্যাপ চিনতে পারেন তা নিশ্চিত করুন

Android শেয়ারশিট ও ইনটেন্ট রিজলভারে আপনার অ্যাপকে আইকন ও লেবেল দিয়ে দেখানো হয়। এই দুটিই ম্যানিফেস্টে সংজ্ঞায়িত করা আছে। আরও প্রাসঙ্গিক তথ্য প্রদান করতে আপনি অ্যাক্টিভিটি বা ইনটেন্ট ফিল্টার লেবেল সেট করতে পারবেন।

Android 10 (API লেভেল ২৯) থেকে, Android শেয়ারশিট শুধুমাত্র আপনার application ট্যাগের ম্যানিফেস্টে সেট করা আইকন ব্যবহার করে। Android, intent-filter ও activity ট্যাগে সেট করা আইকন উপেক্ষা করে।

রিচ কন্টেন্ট পান

ACTION_SEND ইনটেন্ট, অ্যাক্টিভিটি বা নেভিগেশন লেভেলে Android শেয়ারশিট ও ইনটেন্ট রিজলভার থেকে ডেটা পাওয়ার সুবিধা দিলেও, অ্যাপ সরাসরি UI ইন্টার‍্যাকশনের মাধ্যমেও রিচ কন্টেন্ট (যেমন, ছবি, ভিডিও, অডিও ফাইল ও স্টাইল করা টেক্সট) পেতে পারে। এইসব মেকানিজমের মধ্যে রয়েছে:

  • ক্লিপবোর্ড থেকে পেস্ট করা (টাচ করে ধরে রাখার মেনু)
  • সরাসরি সফ্টওয়্যার কীবোর্ড (IME) থেকে মিডিয়া ঢোকানো, যেমন স্টিকার বা GIF
  • মাল্টি-উইন্ডো বা স্প্লিট-স্ক্রিন মোডে অন্য অ্যাপ থেকে কন্টেন্ট টেনে নিয়ে রাখা

ভিউ-ভিত্তিক UI-তে, Android 12 (API লেভেল ৩১) এবং AndroidX Core 1.7, ইউনিফায়েড OnReceiveContentListener API নিয়ে এসেছে। এই লিসেনার ক্লিপবোর্ড, কীবোর্ড এবং টেনে নিয়ে রাখুন থেকে কন্টেন্ট হ্যান্ডলিংকে একটি কলব্যাকে একত্রিত করে। Views-এ এটি প্রয়োগ করার ব্যাপারে বিস্তারিত নির্দেশাবলীর জন্য, রিচ কন্টেন্ট পান দেখুন।

Jetpack Compose-এ, আপনি UI কম্পোনেন্টে (যেমন টেক্সট ফিল্ড) ইনসার্ট করা রিচ কন্টেন্ট রিসিভ করার বিষয়টি Modifier.contentReceiver মডিফায়ার বা টেনে এনে ড্রপ করার মডিফায়ার ব্যবহার করে ম্যানেজ করতে পারবেন।