Android ব্যবহারকারীদের অ্যাপের মধ্যে ডেটা শেয়ার করার জন্য দুটি উপায় প্রদান করে:
- Android শেয়ারশিট মূলত আপনার অ্যাপের বাইরে বা সরাসরি অন্য ব্যবহারকারীকে কন্টেন্ট পাঠানোর জন্য ডিজাইন করা হয়েছে। যেমন, বন্ধুর সাথে URL শেয়ার করা।
- Android ইনটেন্ট রিজলভার, সুনির্দিষ্ট টাস্কের পরবর্তী ধাপে ডেটা পাস করার জন্য সবচেয়ে উপযুক্ত। যেমন, আপনার অ্যাপ থেকে PDF খোলা এবং ব্যবহারকারীদের পছন্দের ভিউয়ার বেছে নিতে দেওয়া।
Android শেয়ারশিট কেন ব্যবহার করবেন
বিভিন্ন অ্যাপ জুড়ে আপনার ব্যবহারকারীদের জন্য ধারাবাহিকতা তৈরি করতে Android Sharesheet ব্যবহার করুন। আপনার অ্যাপের শেয়ার টার্গেটের নিজস্ব তালিকা দেখাবেন না বা আপনার নিজের শেয়ারশিট ভেরিয়েশন তৈরি করবেন না।
Android শেয়ারশিট ব্যবহারকারীদের প্রাসঙ্গিক অ্যাপ সাজেশন সহ সঠিক ব্যক্তির সাথে তথ্য শেয়ার করতে দেয়, সবকিছুই একটি ট্যাপের মাধ্যমে করা যায়। শেয়ারশিট কাস্টম সমাধানের জন্য উপলভ্য নয় এমন টার্গেট সাজেস্ট করতে পারে এবং একটি সামঞ্জস্যপূর্ণ র্যাঙ্কিং ব্যবহার করে। কারণ, Sharesheet অ্যাপ ও ব্যবহারকারীর অ্যাক্টিভিটি সংক্রান্ত তথ্য বিবেচনা করতে পারে যা শুধুমাত্র সিস্টেমে উপলভ্য।
Android শেয়ারশিটে ডেভেলপারদের জন্য অনেক সুবিধাজনক ফিচারও রয়েছে। যেমন, আপনি নিম্নলিখিত কাজগুলি করতে পারেন:
- আপনার ব্যবহারকারীরা কখন এবং কোথায় শেয়ার করা সম্পূর্ণ করেন তা খুঁজে বের করুন
- কাস্টম টার্গেট ও অ্যাপ টার্গেট যোগ করা
- Android 10 (API লেভেল ২৯) থেকে শুরু করে রিচ টেক্সট কন্টেন্টের প্রিভিউ প্রদান করা
- নির্দিষ্ট কম্পোনেন্টের নামের সাথে ম্যাচ করা টার্গেট বাদ দিন
Android শেয়ারশিট ব্যবহার করা
সব ধরনের শেয়ারিংয়ের জন্য, একটি ইনটেন্ট তৈরি করুন এবং এর অ্যাকশন
Intent.ACTION_SEND-এ সেট করুন।
Android শেয়ারশিট দেখাতে, Intent.createChooser() কল করুন,
এতে আপনার Intent অবজেক্ট পাস করুন।
এটি আপনার ইনটেন্টের এমন একটি ভার্সন ফিরিয়ে দেয় যা সবসময় Android শেয়ারশিট দেখায়।
টেক্সট কন্টেন্ট পাঠান
Android শেয়ারশিটের সবচেয়ে সহজ ও সাধারণ ব্যবহার হল একটি অ্যাক্টিভিটি থেকে অন্য অ্যাক্টিভিটিতে টেক্সট কন্টেন্ট পাঠানো। যেমন, বেশিরভাগ ব্রাউজার বর্তমানে দেখানো পৃষ্ঠার URL টেক্সট হিসেবে অন্য অ্যাপের সাথে শেয়ার করতে পারে।
ইমেল বা সোশ্যাল নেটওয়ার্কিংয়ের মাধ্যমে বন্ধুদের সাথে কোনও নিবন্ধ বা ওয়েবসাইট শেয়ার করার জন্য এটি উপযোগী। Jetpack Compose-এ, LocalContext.current ব্যবহার করে বর্তমান প্রসঙ্গ ফিরিয়ে আনুন এবং context.startActivity() কল করুন।
এটি কীভাবে করতে হয় তার একটি উদাহরণ এখানে দেওয়া হল:
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-এর মতো কিছু ইমেল অ্যাপে
String[]-এর সাথে EXTRA_EMAIL এবং EXTRA_CC-এর মতো অতিরিক্ত তথ্য আশা করা হয়। আপনার ইনটেন্টে এগুলি যোগ করতে
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দেখুন।scanFile()ব্যবহার করেMediaStore-এ ফাইল যোগ করা যেতে পারে, যার পরে শেয়ার করার জন্য উপযুক্তcontent://-স্টাইলUriপ্রদান করাonScanCompleted()কলব্যাকে পাস করা হয়। মনে রাখবেন, সিস্টেমMediaStore-এ যোগ করা হলে, ডিভাইসের যেকোনও অ্যাপ থেকে কন্টেন্ট অ্যাক্সেস করা যাবে।
সঠিক MIME-এর ধরন ব্যবহার করুন
আপনি যে ডেটা পাঠাচ্ছেন তার জন্য উপলভ্য সবচেয়ে নির্দিষ্ট MIME-এর ধরন প্রদান করুন। যেমন, প্লেন টেক্সট শেয়ার করার সময় text/plain ব্যবহার করুন। Android-এ ডেটা পাঠানোর সময়
সাধারণত যেসব MIME-এর ধরন ব্যবহার করা হয়, সেগুলি এখানে দেওয়া হল:
| প্রাপক এর জন্য রেজিস্টার করেন | প্রেরক পাঠান |
|---|---|
text/* |
|
image/* |
|
video/* |
|
| এই ধরনের ফাইল এক্সটেনশন কাজ করে | application/pdf |
হার্ডকোড করার পরিবর্তে রানটাইমে ডাইনামিকভাবে MIME-এর প্রকার নির্ধারণ করতে, নিম্নলিখিত পদ্ধতিগুলি ব্যবহার করুন:
content://URI-এর জন্য (যেমন,FileProviderবাMediaStoreদ্বারা প্রদত্ত),ContentResolver.getType()-এ কল করুন।- ফাইল এক্সটেনশনের জন্য,
MimeTypeMap.getSingleton().getMimeTypeFromExtension()কল করুন। - আপনি Storage Access Framework ব্যবহার করলে,
DocumentFile.getType()-এও কোয়েরি করতে পারবেন।
আপনি যদি কোনও নির্দিষ্ট MIME-এর প্রকার নির্ধারণ করতে না পারেন, তাহলে জেনেরিক বাইনারি ডেটার জন্য application/octet-stream বা শেষ উপায় হিসেবে */* ব্যবহার করুন।
MIME-এর প্রকার সম্পর্কে আরও জানতে, MIME মিডিয়া প্রকারের IANA অফিসিয়াল রেজিস্ট্রি দেখুন।
প্রদান করা MIME-এর প্রকারের উপর নির্ভর করে Android শেয়ারশিট কন্টেন্টের প্রিভিউ দেখাতে পারে। কিছু ফিচারের প্রিভিউ শুধুমাত্র নির্দিষ্ট ধরনের জন্য উপলভ্য।
একাধিক কন্টেন্ট শেয়ার করা
একাধিক কন্টেন্ট শেয়ার করতে, ACTION_SEND_MULTIPLE
অ্যাকশন ব্যবহার করুন এবং এর সাথে কন্টেন্টের URI-এর তালিকা যোগ করুন। আপনি যে ধরনের কন্টেন্ট শেয়ার করছেন তার উপর নির্ভর করে
MIME-এর প্রকার পরিবর্তিত হয়। যেমন, আপনি তিনটি JPEG ছবি শেয়ার করলে, আপনি
"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 ১০ (API লেভেল ২৯) থেকে শুরু করে, Android শেয়ারশিট শেয়ার করা হচ্ছে এমন টেক্সটের প্রিভিউ দেখায়। কিছু ক্ষেত্রে, শেয়ার করা টেক্সট বোঝা কঠিন হতে পারে। https://www.google.com/search?ei=2rRVXcLkJajM0PEPoLy7oA4-এর মতো জটিল URL শেয়ার করার কথা বিবেচনা করুন। আরও উন্নত
প্রিভিউ আপনার ব্যবহারকারীদের আশ্বস্ত করতে পারে যে কী শেয়ার করা হচ্ছে।
আপনি টেক্সটের প্রিভিউ দেখলে, শীর্ষক, থাম্বনেল ছবি বা দুটিই সেট করতে পারবেন। Intent.createChooser()-কে কল করার আগে Intent.EXTRA_TITLE-এ
বিবরণ যোগ করুন এবং ClipData ব্যবহার করে
প্রাসঙ্গিক থাম্বনেল যোগ করুন।
মনে রাখবেন: ছবির কন্টেন্ট URI,
FileProvider থেকে প্রদান করা হয়, সাধারণত কনফিগার করা <cache-path> থেকে আসে।
আরও তথ্যের জন্য, ফাইল শেয়ার করা দেখুন। থাম্বনেল হিসেবে ব্যবহার করতে চান এমন যেকোনও ছবি পড়ার জন্য
শেয়ারশিটকে সঠিক অনুমতি দিতে ভুলবেন না। আরও তথ্যের জন্য,
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 14 (API লেভেল 34) এবং তার পরবর্তী ভার্সনে, অ্যাপ Android শেয়ারশিটে কাস্টম অ্যাকশন যোগ করতে পারে।
কাস্টম অ্যাকশনগুলি Android শেয়ারশিটের উপরে ছোট অ্যাকশন আইকন হিসেবে দেখানো হয় এবং অ্যাপগুলি
আইকনে ক্লিক করার সময় অ্যাকশন হিসেবে যেকোনও Intent নির্দিষ্ট করতে পারে।
Android শেয়ারশিটে কাস্টম অ্যাকশন যোগ করতে, প্রথমে ChooserAction.Builder-এর সাথে
ChooserAction তৈরি করুন।
আইকনে ক্লিক করা হলে, আপনি অ্যাকশন হিসেবে PendingIntent নির্দিষ্ট করতে পারবেন। আপনার সব কাস্টম অ্যাকশন সহ একটি অ্যারে তৈরি করুন এবং শেয়ার Intent-এর
EXTRA_CHOOSER_CUSTOM_ACTIONS
হিসেবে এটি উল্লেখ করুন।
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 শেয়ারশিট আপনাকে সর্বাধিক দুটি কাস্টম অ্যাক্টিভিটি ইনটেন্ট নির্দিষ্ট করতে দেয়
যা Intent.EXTRA_INITIAL_INTENTS ব্যবহার করে অ্যাপ সাজেশনের আগে তালিকাভুক্ত করা হয়।
সরাসরি শেয়ার টার্গেটের (যেমন, কথোপকথন বা পরিচিতি) জন্য,
ShortcutManagerCompat ব্যবহার করে ডায়নামিক শর্টকাট প্রকাশ করুন
(সরাসরি শেয়ার টার্গেট প্রদান করুন দেখুন):
Intent.createChooser()-এ কল করার
পরে আপনার শেয়ার ইনটেন্টে
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
যোগ করবেন, সিস্টেম ততগুলি কম সাজেস্ট করবে। সাধারণত, কাস্টম টার্গেট
যোগ করা এড়িয়ে চলুন। Intent.EXTRA_INITIAL_INTENTS যোগ করার একটি সাধারণ উপযুক্ত উদাহরণ হল
শেয়ার করা কন্টেন্টে ব্যবহারকারীরা নিতে পারেন এমন অতিরিক্ত অ্যাকশন প্রদান করা। যেমন, কোনও ব্যবহারকারী ছবি শেয়ার করেন এবং Intent.EXTRA_INITIAL_INTENTS ব্যবহার করা হয়
যাতে তিনি এর পরিবর্তে লিঙ্ক পাঠাতে পারেন।
কম্পোনেন্ট অনুযায়ী নির্দিষ্ট টার্গেট বাদ দেওয়া
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 আপনাকে এই তথ্য পেতে সাহায্য করে। এর জন্য এটি আপনার ব্যবহারকারীদের বেছে নেওয়া টার্গেটের ComponentName প্রদান করে। ব্যবহারকারীরা IntentSender ব্যবহার করে এই টার্গেট বেছে নেয়।
প্রথমে 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 শেয়ারশিট কল করার জন্য
যেমন করতেন, ঠিক তেমনভাবে অতিরিক্ত তথ্য যোগ করুন। তবে, 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) }
আরও জানুন
ডেটা পাঠানোর ব্যাপারে আরও তথ্যের জন্য, ইনটেন্ট ও ইনটেন্ট ফিল্টার দেখুন।