অন্যান্য অ্যাপ থেকে সাধারণ ডেটা পাওয়া

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

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

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

  2. আপনার Compose নেভিগেশন গ্রাফে একটি navDeepLink নির্ধারণ করুন: আপনার অ্যাক্টিভিটির onCreate বা onNewIntent মেথডের মধ্যে ম্যানুয়ালি ইন্টারসেপ্ট ও পার্স করার পরিবর্তে, Compose নেভিগেশনের ডিপ লিঙ্ক সংক্রান্ত সহায়তা ব্যবহার করুন। যে কম্পোজ করার উপযুক্ত ডেস্টিনেশনে কন্টেন্ট দেখানো হবে, সেটির সাথে সরাসরি অ্যাকশন ও MIME ধরনের সাথে ম্যাচ করা navDeepLink অ্যাটাচ করুন। NavController অটোমেটিক Intent ইন্টারসেপ্ট করবে এবং ব্যবহারকারীকে সরাসরি সেই স্ক্রিনে নিয়ে যাবে।

সরাসরি শেয়ারের টার্গেট হল আপনার অ্যাপের মধ্যে থাকা নির্দিষ্ট অ্যাক্টিভিটিতে ডিপ লিঙ্ক করা। এগুলি প্রায়ই কোনও ব্যক্তি বা গ্রুপকে বোঝায় এবং 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 অফিসিয়াল রেজিস্ট্রি দেখুন।

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

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

অ্যাক্টিভিটির সাথে ডেটা পাওয়া

অ্যাক্টিভিটির সাথে ডেটা পাওয়ার মধ্যে আপনার ম্যানিফেস্ট আপডেট করা, ইনকামিং কন্টেন্ট ম্যানেজ করা এবং ব্যবহারকারী যাতে আপনার অ্যাপ চিনতে পারেন তা নিশ্চিত করা অন্তর্ভুক্ত।

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

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

<activity android:name=".ui.MyActivity" >
    <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-এর মধ্যে কন্টেন্ট সঠিকভাবে ম্যানেজ করার দায়িত্ব আপনার উপর বর্তায়।

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

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

ইনকামিং ডেটা চেক করার সময় অতিরিক্ত সতর্কতা অবলম্বন করুন, কারণ অন্য কোনও অ্যাপ্লিকেশন আপনাকে কী পাঠাতে পারে তা আপনি জানেন না। যেমন, ভুল MIME টাইপ সেট করা হতে পারে অথবা পাঠানো ছবিটি অত্যন্ত বড় হতে পারে। এছাড়াও, মনে রাখবেন যে বাইনারি ডেটা মূল ("UI") থ্রেডের পরিবর্তে একটি আলাদা থ্রেডে প্রসেস করতে হবে।

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

ডেটা পাওয়ার পরে 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 Sharesheet শুধুমাত্র আপনার application ট্যাগে ম্যানিফেস্টে সেট করা আইকন ব্যবহার করে। Android, intent-filter এবং activity ট্যাগে সেট করা আইকন উপেক্ষা করে।