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

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

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

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

  2. আপনার কম্পোজ নেভিগেশন গ্রাফে একটি 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-এর মধ্যে কন্টেন্ট সঠিকভাবে ম্যানেজ করার দায়িত্ব আপনার।

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

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

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

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 Sharesheet ও ইনটেন্ট রিজলভার থেকে ডেটা পাওয়ার সুবিধা চালু করলেও, অ্যাপগুলি সরাসরি UI ইন্টার‍্যাকশনের মাধ্যমে রিচ কন্টেন্ট (যেমন, ছবি, ভিডিও, অডিও ফাইল ও স্টাইল করা টেক্সট) পেতে পারে। এইসব মেকানিজমের মধ্যে রয়েছে:

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

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

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