অন্যান্য অ্যাপে ডেটা পাঠানো

ব্যবহারকারীদের তাদের পছন্দের অ্যাপ ব্যবহার করে দ্রুত তথ্য শেয়ার করতে দিতে Android ইনটেন্ট ও তার সাথে যুক্ত এক্সট্রা ব্যবহার করে।

Android ব্যবহারকারীদের জন্য অ্যাপের মধ্যে ডেটা শেয়ার করার দুটি উপায় প্রদান করে:

  • Android Sharesheet মূলত আপনার অ্যাপের বাইরে এবং/অথবা সরাসরি অন্য ব্যবহারকারীকে কন্টেন্ট পাঠানোর জন্য ডিজাইন করা হয়েছে। যেমন, বন্ধুর সাথে URL শেয়ার করা।
  • ভালভাবে সংজ্ঞায়িত টাস্কের পরবর্তী ধাপে ডেটা পাস করার জন্য Android ইনটেন্ট রেজোলভার সবচেয়ে উপযুক্ত। যেমন, আপনার অ্যাপ থেকে কোনও PDF খোলা এবং ব্যবহারকারীদের তাদের পছন্দের ভিউয়ার বেছে নিতে দেওয়া।

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

Android শেয়ারশিট কেন ব্যবহার করবেন

ছবি ১. Android শেয়ারশিট।

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

Android শেয়ারশিট ব্যবহারকারীদের সঠিক ব্যক্তির সাথে তথ্য শেয়ার করতে দেয়, এর সাথে প্রাসঙ্গিক অ্যাপের সাজেশনও দেওয়া হয়, এই সবকিছুই একটি ট্যাপের মাধ্যমে করা যায়। Sharesheet কাস্টম সলিউশনের জন্য উপলভ্য নয় এমন টার্গেট সাজেস্ট করতে পারে এবং একটি ধারাবাহিক র‍্যাংকিং ব্যবহার করে। এর কারণ হল, Sharesheet অ্যাপ ও ব্যবহারকারীর অ্যাক্টিভিটি সম্পর্কিত তথ্য বিবেচনা করতে পারে যা শুধুমাত্র সিস্টেমের কাছেই উপলভ্য।

এছাড়াও, Android Sharesheet-এ ডেভেলপারদের জন্য অনেক উপযোগী ফিচার আছে। যেমন, আপনি নিচে উল্লেখ করা কাজগুলি করতে পারবেন:

Android শেয়ারশিট ব্যবহার করা

সব ধরনের শেয়ারিংয়ের জন্য, একটি ইনটেন্ট তৈরি করুন এবং এর অ্যাকশনকে Intent.ACTION_SEND হিসেবে সেট করুন। Android Sharesheet দেখাতে, Intent.createChooser() কল করুন, আপনার Intent অবজেক্ট এতে পাস করুন। এটি আপনার ইনটেন্টের এমন একটি ভার্সন রিটার্ন করে যা সবসময় Android Sharesheet দেখায়।

টেক্সট কন্টেন্ট পাঠানো

Android Sharesheet-এর সবচেয়ে সহজ ও সাধারণ ব্যবহার হল একটি অ্যাক্টিভিটি থেকে অন্য অ্যাক্টিভিটিতে টেক্সট কন্টেন্ট পাঠানো। যেমন, বেশিরভাগ ব্রাউজার বর্তমানে দেখানো পৃষ্ঠার URL টেক্সট হিসেবে অন্য অ্যাপের সাথে শেয়ার করতে পারে। ইমেল বা সোশ্যাল নেটওয়ার্কিংয়ের মাধ্যমে বন্ধুদের সাথে কোনও নিবন্ধ বা ওয়েবসাইট শেয়ার করার জন্য এটি উপযোগী। এটি কীভাবে করবেন তার একটি উদাহরণ এখানে দেওয়া হল:

fun shareText(context: Context) {
    val sendIntent: Intent = Intent().apply {
        action = ACTION_SEND
        putExtra(Intent.EXTRA_TEXT, "This is my text to send.")
        type = "text/plain"
    }

    val shareIntent = Intent.createChooser(sendIntent, null)
    context.startActivity(shareIntent)
}

ঐচ্ছিকভাবে, আপনি আরও তথ্য যোগ করতে পারেন, যেমন ইমেল প্রাপক (EXTRA_EMAIL, EXTRA_CC, EXTRA_BCC), ইমেলের বিষয় (EXTRA_SUBJECT) ইত্যাদি।

মনে রাখবেন: Gmail-এর মতো কিছু ইমেল অ্যাপ, অতিরিক্ত ফিচার যেমন EXTRA_EMAIL ও EXTRA_CC-এর জন্য String[] আশা করে। আপনার ইনটেন্টে এগুলি যোগ করতে putExtra(String, String[]) ব্যবহার করুন।

বাইনারি কন্টেন্ট পাঠানো

ACTION_SEND অ্যাকশন ব্যবহার করে বাইনারি ডেটা শেয়ার করুন। উপযুক্ত MIME-এর ধরন সেট করুন এবং অতিরিক্ত EXTRA_STREAM-এ ডেটার URI রাখুন, যেমন নিচের উদাহরণে দেখানো হয়েছে। এটি সাধারণত কোনও ছবি শেয়ার করার জন্য ব্যবহার করা হয়, তবে যেকোনও ধরনের বাইনারি কন্টেন্ট শেয়ার করার জন্য ব্যবহার করা যেতে পারে।

fun shareBinaryContent(context: Context) {
    val shareIntent: Intent = Intent().apply {
        action = ACTION_SEND
        // Example: content://com.google.android.apps.photos.contentprovider/...
        val imageUri: Uri =
            Uri.parse("content://com.google.android.apps.photos.contentprovider/0/1/mediakey/1")
        putExtra(Intent.EXTRA_STREAM, imageUri)
        type = "image/jpeg"
    }
    context.startActivity(Intent.createChooser(shareIntent, null))
}

যে অ্যাপ্লিকেশন ডেটা পাচ্ছে, সেটিকে Uri পয়েন্ট করা ডেটা অ্যাক্সেস করার অনুমতি দিতে হবে। এটি করার জন্য দুটি সাজেস্ট করা উপায় আছে:

  • আপনার নিজের ContentProvider-এ ডেটা স্টোর করুন, এটি নিশ্চিত করে যে অন্যান্য অ্যাপের কাছে আপনার প্রদানকারীকে অ্যাক্সেস করার সঠিক অনুমতি আছে। অ্যাক্সেস দেওয়ার জন্য পছন্দসই মেকানিজম হল প্রতি URI অনুমতি ব্যবহার করা, যা সাময়িক এবং শুধুমাত্র গ্রহণকারী অ্যাপ্লিকেশনকে অ্যাক্সেস দেয়। এই ধরনের ContentProvider তৈরি করতে, FileProviderসহায়ক ক্লাস ব্যবহার করুন।
  • সিস্টেম MediaStore ব্যবহার করুন। MediaStore মূলত ভিডিও, অডিও ও ছবির MIME ধরনের জন্য। তবে, Android 3.0 (API লেভেল 11) থেকে শুরু করে, এটি নন-মিডিয়া টাইপও সেভ করতে পারে। আরও তথ্যের জন্য, MediaStore.Files দেখুন। MediaStore-এ ফাইল যোগ করা যেতে পারে, এর জন্য scanFile() ব্যবহার করা হয়, এর পরে শেয়ার করার উপযুক্ত content://-স্টাইলের Uri একটি ফাইল প্রদান করা onScanCompleted() কলব্যাক ফাংশনে পাস করা হয়। মনে রাখবেন, সিস্টেমে MediaStore যোগ করা হলে, কন্টেন্টটি ডিভাইসের যেকোনও অ্যাপ অ্যাক্সেস করতে পারবে।

সঠিক MIME-এর ধরন ব্যবহার করুন

আপনি যে ডেটা পাঠাচ্ছেন তার জন্য উপলভ্য সবচেয়ে নির্দিষ্ট MIME-এর ধরন প্রদান করুন। যেমন, প্লেন টেক্সট শেয়ার করার সময় text/plain ব্যবহার করুন। 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-এর ধরন সম্পর্কে আরও তথ্য পেতে, MIME মিডিয়ার ধরনের IANA অফিসিয়াল রেজিস্ট্রি দেখুন।

প্রদান করা MIME ধরনের উপর নির্ভর করে, Android শেয়ারশিট কন্টেন্টের প্রিভিউ দেখাতে পারে। কিছু প্রিভিউ ফিচার শুধুমাত্র নির্দিষ্ট ধরনের জন্য উপলভ্য।

একাধিক কন্টেন্ট শেয়ার করা

একাধিক কন্টেন্ট শেয়ার করতে, কন্টেন্টের দিকে নির্দেশ করে এমন URI-এর তালিকার সাথে ACTION_SEND_MULTIPLE অ্যাকশন ব্যবহার করুন। আপনি যে কন্টেন্ট শেয়ার করছেন সেটির মিক্স অনুযায়ী MIME-এর ধরন আলাদা আলাদা হয়। যেমন, আপনি তিনটি JPEG ছবি শেয়ার করলে, আপনাকে type "image/jpg" ব্যবহার করতে হবে। বিভিন্ন ধরনের ছবির জন্য, যেকোনও ধরনের ছবি ম্যানেজ করে এমন অ্যাক্টিভিটির সাথে ম্যাচ করাতে "image/*" ব্যবহার করুন। যদিও বিভিন্ন ধরনের কন্টেন্ট একসাথে শেয়ার করা যায়, তবে আমরা এটি করতে বারণ করি, কারণ প্রাপকের কাছে কী পাঠানো হচ্ছে তা স্পষ্ট হয় না। একাধিক ধরনের তথ্য পাঠানো প্রয়োজন হলে, "*/*" ব্যবহার করুন। আপনার ডেটা পার্স ও প্রসেস করার দায়িত্ব যে অ্যাপ্লিকেশন ডেটা পাচ্ছে তার। এখানে একটি উদাহরণ দেওয়া হল:

fun shareMultiple(context: Context) {
    val imageUris: ArrayList<Uri> = arrayListOf(
        Uri.parse("content://com.google.android.apps.photos.contentprovider/0/1/mediakey/1"),
        Uri.parse("content://com.google.android.apps.photos.contentprovider/0/1/mediakey/2")
    )

    val shareIntent = Intent().apply {
        action = Intent.ACTION_SEND_MULTIPLE
        putParcelableArrayListExtra(Intent.EXTRA_STREAM, imageUris)
        type = "image/*"
    }
    context.startActivity(Intent.createChooser(shareIntent, null))
}

নিশ্চিত করুন যে প্রদান করা Uri অবজেক্ট এমন ডেটার দিকে পয়েন্ট করছে যা গ্রহণকারী অ্যাপ্লিকেশন অ্যাক্সেস করতে পারে।

টেক্সট প্রিভিউতে উন্নত কন্টেন্ট যোগ করা

Android 10 (API লেভেল ২৯) থেকে শুরু করে, Android শেয়ারশিট শেয়ার করা হচ্ছে এমন টেক্সটের প্রিভিউ দেখায়। কিছু ক্ষেত্রে, শেয়ার করা টেক্সট বোঝা কঠিন হতে পারে। https://www.google.com/search?ei=2rRVXcLkJajM0PEPoLy7oA4-এর মতো জটিল URL শেয়ার করার কথা বিবেচনা করুন। আরও বিশদ প্রিভিউ আপনার ব্যবহারকারীদের আশ্বস্ত করতে পারে যে কী শেয়ার করা হচ্ছে।

আপনি টেক্সট প্রিভিউ করলে, একটি শীর্ষক, থাম্বনেল ছবি বা দুটিই সেট করতে পারবেন। Intent.EXTRA_TITLE কল করার আগে Intent.createChooser(), একটি বিবরণ যোগ করুন এবং ClipData ব্যবহার করে প্রাসঙ্গিক থাম্বনেল যোগ করুন।

মনে রাখবেন: ছবি কন্টেন্টের URI একটি FileProvider থেকে প্রদান করা হয়, সাধারণত একটি কনফিগার করা <cache-path> থেকে। আরও তথ্যের জন্য, ফাইল শেয়ার করা দেখুন। আপনি থাম্বনেল হিসেবে ব্যবহার করতে চান এমন যেকোনও ছবি Sharesheet যাতে পড়তে পারে সেই জন্য সঠিক অনুমতি দিতে ভুলবেন না। আরও তথ্যের জন্য, Intent.FLAG_GRANT_READ_URI_PERMISSION দেখুন।

এখানে একটি উদাহরণ দেওয়া হল:

fun richContentToTextPreviewShares(context: Context) {
    val share = Intent.createChooser(
        Intent().apply {
            action = ACTION_SEND
            putExtra(Intent.EXTRA_TEXT, "https://developer.android.com/training/sharing/")

            // (Optional) Here you're setting the title of the content
            putExtra(Intent.EXTRA_TITLE, "Introducing content previews")

            // (Optional) Here you're passing a content URI to an image to be displayed
            data =
                Uri.parse("content://com.google.android.apps.photos.contentprovider/0/1/mediakey/A123456789")
            flags = Intent.FLAG_GRANT_READ_URI_PERMISSION
        },
        null
    )
    context.startActivity(share)
}

প্রিভিউটি দেখতে এইরকম হবে:

ছবি ২. Android Sharesheet-এ টেক্সট কন্টেন্টের প্রিভিউ।

শেয়ারশিটে কাস্টম অ্যাকশন যোগ করা

ছবি ৩. Android শেয়ারশিটে কাস্টম অ্যাকশন।

Android 14 (API লেভেল 34) ও তার পরবর্তী যেকোনও ভার্সনে, অ্যাপ Android Sharesheet-এ কাস্টম অ্যাকশন যোগ করতে পারে। কাস্টম অ্যাকশনগুলি Android শেয়ারশিটের উপরে ছোট অ্যাকশন আইকন হিসেবে দেখানো হয় এবং আইকনে ক্লিক করা হলে কোন Intent অ্যাকশন চালু হবে তা অ্যাপ নির্দিষ্ট করতে পারে।

Android শেয়ারশিটে কাস্টম অ্যাকশন যোগ করতে, প্রথমে ChooserAction ChooserAction.Builder তৈরি করুন। আইকনে ক্লিক করলে কোন অ্যাকশন নেওয়া হবে তা আপনি PendingIntent হিসেবে নির্দিষ্ট করতে পারবেন। আপনার কাস্টম অ্যাকশন সহ একটি অ্যারে তৈরি করুন এবং এটিকে EXTRA_CHOOSER_CUSTOM_ACTIONS শেয়ারের Intentহিসেবে নির্দিষ্ট করুন।

fun sharesheetCustomActions(context: Context, previewText: String) {
    val sendIntent = Intent(ACTION_SEND)
        .setType("text/plain")
        .putExtra(Intent.EXTRA_TEXT, previewText)
    val shareIntent = Intent.createChooser(sendIntent, null)
    val customActions = arrayOf(
        ChooserAction.Builder(
            Icon.createWithResource(context, R.drawable.ic_logo),
            "Custom",
            PendingIntent.getBroadcast(
                context,
                1,
                Intent(Intent.ACTION_VIEW),
                PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_CANCEL_CURRENT
            )
        ).build()
    )
    shareIntent.putExtra(Intent.EXTRA_CHOOSER_CUSTOM_ACTIONS, customActions)
    context.startActivity(shareIntent)
}

কাস্টম টার্গেট যোগ করা

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

ছবি ৪. Android শেয়ারশিটে কাস্টম টার্গেট।

Intent.createChooser() কল করার পরে আপনার শেয়ার ইনটেন্টে Intent.EXTRA_CHOOSER_TARGETS ও Intent.EXTRA_INITIAL_INTENTS যোগ করুন:

val sendIntent = Intent(ACTION_SEND).apply {
    type = "text/plain"
    putExtra(Intent.EXTRA_TEXT, previewText)
}

val customIntent = Intent().apply {
    component = ComponentName(context.packageName, "${context.packageName}.CustomActivity")
}

val shareIntent = Intent.createChooser(sendIntent, null).apply {
    putExtra(
        Intent.EXTRA_INITIAL_INTENTS,
        arrayOf(customIntent)
    )
}
context.startActivity(shareIntent)

এই ফিচারটি সাবধানে ব্যবহার করুন। আপনি যোগ করা প্রতিটি কাস্টম Intent ও ChooserTarget সিস্টেমের সাজেস্ট করা সংখ্যাকে কমিয়ে দেয়। আমরা সাধারণত কাস্টম টার্গেট যোগ করার ব্যাপারে উৎসাহ দিই না। Intent.EXTRA_INITIAL_INTENTS যোগ করার একটি সাধারণ উপযুক্ত উদাহরণ হল, শেয়ার করা কন্টেন্টের উপর ব্যবহারকারীরা যেসব অতিরিক্ত অ্যাকশন নিতে পারেন তা প্রদান করা। যেমন, কোনও ব্যবহারকারী ছবি শেয়ার করলে, Intent.EXTRA_INITIAL_INTENTS ব্যবহার করে তাকে পরিবর্তে একটি লিঙ্ক পাঠাতে দেওয়া হয়। Intent.EXTRA_CHOOSER_TARGETS যোগ করার একটি সাধারণ উপযুক্ত উদাহরণ হল, আপনার অ্যাপ প্রদান করে এমন প্রাসঙ্গিক লোকজন বা ডিভাইসকে এক্সপোজ করা।

কম্পোনেন্ট অনুযায়ী নির্দিষ্ট টার্গেট বাদ দেওয়া

আপনি Intent.EXTRA_EXCLUDE_COMPONENTS প্রদান করে নির্দিষ্ট টার্গেট বাদ দিতে পারেন। আপনি নিয়ন্ত্রণ করতে পারেন এমন টার্গেট সরাতে শুধুমাত্র এটি করুন। সাধারণত, আপনার ব্যবহারকারীরা অ্যাপের মধ্যে থেকে শেয়ার করলে, আপনার অ্যাপের শেয়ার টার্গেট লুকিয়ে রাখা হয়, কারণ তারা সম্ভবত অ্যাপের বাইরে শেয়ার করতে চান।

Intent.createChooser() কল করার পরে আপনার ইনটেন্টে Intent.EXTRA_EXCLUDE_COMPONENTS যোগ করুন:

fun excludeSpecificTargets(context: Context) {
    val share = Intent.createChooser(Intent(ACTION_SEND), null).apply {
        // Only use for components you have control over
        val excludedComponentNames =
            arrayOf(ComponentName("com.example.android", "ExampleClass"))
        putExtra(Intent.EXTRA_EXCLUDE_COMPONENTS, excludedComponentNames)
    }
    context.startActivity(share)
}

শেয়ার করা সম্পর্কে তথ্য পান

আপনার ব্যবহারকারীরা কখন শেয়ার করছেন এবং কোন টার্গেট বেছে নিচ্ছেন তা জানলে সুবিধা হয়। Android Sharesheet আপনাকে এই তথ্য পেতে দেয়। এর জন্য IntentSender ব্যবহার করে আপনার ব্যবহারকারীদের বেছে নেওয়া টার্গেটের ComponentName প্রদান করতে হয়।

প্রথমে BroadcastReceiver-এর জন্য PendingIntent তৈরি করুন এবং Intent.createChooser()-এ এর IntentSender দিন:

fun infoAboutSharing(context: Context, requestCode: Int) {
    var share = Intent(ACTION_SEND)
    // ...
    val pi = PendingIntent.getBroadcast(
        context, requestCode,
        Intent(context, ShareBroadcastReceiver::class.java),
        PendingIntent.FLAG_MUTABLE or PendingIntent.FLAG_UPDATE_CURRENT
    )
    share = Intent.createChooser(share, null, pi.intentSender)
    context.startActivity(share)
}

MyBroadcastReceiver-এ কলব্যাক পান এবং Intent.EXTRA_CHOOSER_RESULT-এ দেখুন:

override fun onReceive(context: Context?, intent: Intent) {
    val TAG = ShareBroadcastReceiver::class.simpleName
    val chooserResult: ChooserResult? = IntentCompat.getParcelableExtra(
        intent,
        Intent.EXTRA_CHOOSER_RESULT,
        ChooserResult::class.java,
    )
    chooserResult?.let {
        Log.i(TAG,
            "Share callback: isShortcut: ${it.isShortcut}, type: ${typeToString(it.type)}, componentName: ${it.selectedComponent}",
        )
    } ?: Log.i(TAG, "chooserResult is null")
}

আরও তথ্যের জন্য প্ল্যাটফর্ম শেয়ার স্যাম্পেল দেখুন।

Android ইনটেন্ট রেজোলভার ব্যবহার করা

ছবি ৫. ACTION_SEND ইনটেন্ট রেজোলভার।

ভালভাবে সংজ্ঞায়িত টাস্ক ফ্লোর অংশ হিসেবে অন্য অ্যাপে ডেটা পাঠানোর সময় Android ইনটেন্ট রেজোলভার সবচেয়ে ভাল ব্যবহার করা হয়।

Android ইনটেন্ট রিজলভার ব্যবহার করতে, একটি ইনটেন্ট তৈরি করুন এবং Android Sharesheet-এ কল করার মতো অতিরিক্ত তথ্য যোগ করুন। তবে, Intent.createChooser()-এ কল করবেন না ।

ফিল্টার করা আছে এমন একাধিক ইনস্টল করা অ্যাপ্লিকেশন থাকলে যেগুলি ACTION_SEND এবং MIME ধরনের সাথে ম্যাচ করে, সিস্টেম ইনটেন্ট সমাধানকারী নামের একটি দ্ব্যর্থতা নিরসন ডায়ালগ দেখায় যা ব্যবহারকারীকে শেয়ার করার জন্য একটি টার্গেট বেছে নিতে দেয়। একটি অ্যাপ্লিকেশন ম্যাচ করলে, সেটি রান করে।

টেক্সট পাঠানোর জন্য Android ইনটেন্ট রেজলভার কীভাবে ব্যবহার করতে হয় তার একটি উদাহরণ এখানে দেওয়া হল:

fun intentResolver(context: Context) {
    val sendIntent: Intent = Intent().apply {
        action = ACTION_SEND
        putExtra(Intent.EXTRA_TEXT, "This is my text to send.")
        type = "text/plain"
    }
    context.startActivity(sendIntent)
}

আরও জানুন

ডেটা পাঠানো সম্পর্কে আরও জানতে, ইনটেন্ট ও ইনটেন্ট ফিল্টার দেখুন।