যেসব অ্যাপ মেসেজিং সমর্থন করে, তারা তাদের মেসেজিং নোটিফিকেশনগুলোকে এমনভাবে প্রসারিত করতে পারে যাতে অ্যান্ড্রয়েড অটো চালু থাকা অবস্থায় সেগুলো গ্রহণ করতে পারে। এই নোটিফিকেশনগুলো অ্যান্ড্রয়েড অটো দ্বারা প্রদর্শিত হয় এবং ব্যবহারকারীদের একটি সামঞ্জস্যপূর্ণ ও কম মনোযোগ-বিঘ্নকারী ইন্টারফেসে মেসেজ পড়তে ও উত্তর দিতে দেয়। আর যখন আপনি MessagingStyle API ব্যবহার করেন, তখন আপনি অ্যান্ড্রয়েড অটো সহ সমস্ত অ্যান্ড্রয়েড ডিভাইসের জন্য অপ্টিমাইজ করা মেসেজ নোটিফিকেশন পান। এই অপ্টিমাইজেশনগুলোর মধ্যে রয়েছে মেসেজ নোটিফিকেশনের জন্য বিশেষভাবে তৈরি একটি UI, উন্নত অ্যানিমেশন এবং ইনলাইন ইমেজের জন্য সমর্থন।
এই নির্দেশিকাটি আপনাকে দেখাবে কিভাবে একটি চ্যাট অ্যাপের মতো, ব্যবহারকারীকে বার্তা প্রদর্শন ও তার উত্তর গ্রহণকারী কোনো অ্যাপকে প্রসারিত করে বার্তা প্রদর্শন এবং উত্তর গ্রহণের কাজটি অ্যান্ড্রয়েড অটো-র হাতে তুলে দেওয়া যায়। এই ইন্টিগ্রেশনের মাধ্যমে, ব্যবহারকারীরা শুধুমাত্র তাদের সক্রিয় অ্যান্ড্রয়েড অটো সেশন চলাকালীন প্রাপ্ত নোটিফিকেশনগুলোর বার্তার ইতিহাস দেখতে পারবেন। তাদের সক্রিয় অ্যান্ড্রয়েড অটো সেশন শুরু হওয়ার আগের বার্তাগুলো প্রদর্শন করার জন্য, আপনি একটি টেমপ্লেটেড মেসেজিং এক্সপেরিয়েন্স তৈরি করতে পারেন।
সম্পর্কিত ডিজাইন নির্দেশনার জন্য, 'ডিজাইন ফর কার্স' হাবের 'কমিউনিকেশনস অ্যাপস' দেখুন।
শুরু করুন
অ্যান্ড্রয়েড অটোর জন্য মেসেজিং পরিষেবা প্রদান করতে, আপনার অ্যাপকে অবশ্যই ম্যানিফেস্টে অ্যান্ড্রয়েড অটোর জন্য তার সমর্থন ঘোষণা করতে হবে এবং নিম্নলিখিত কাজগুলো করতে সক্ষম হতে হবে:
- অ্যান্ড্রয়েড অটোর জন্য সমর্থন ঘোষণা করুন
-
NotificationCompat.MessagingStyleঅবজেক্ট তৈরি করুন এবং পাঠান, যেগুলোতে রিপ্লাই এবং মার্ক-অ্যাজ-রিডActionঅবজেক্ট থাকবে। - একটি
Serviceমাধ্যমে কথোপকথনের উত্তর দেওয়া এবং সেটিকে পঠিত হিসেবে চিহ্নিত করার কাজটি পরিচালনা করুন।
ধারণা এবং বস্তু
আপনার অ্যাপ ডিজাইন করা শুরু করার আগে, অ্যান্ড্রয়েড অটো কীভাবে মেসেজিং পরিচালনা করে তা বোঝা সহায়ক।
যোগাযোগের একটি স্বতন্ত্র অংশকে বার্তা বলা হয় এবং এটি MessagingStyle.Message ক্লাস দ্বারা উপস্থাপিত হয়। একটি বার্তায় প্রেরক, বার্তার বিষয়বস্তু এবং বার্তাটি পাঠানোর সময় থাকে।
ব্যবহারকারীদের মধ্যে যোগাযোগকে কথোপকথন বলা হয় এবং এটি একটি MessagingStyle অবজেক্ট দ্বারা উপস্থাপিত হয়। একটি কথোপকথন বা MessagingStyle একটি শিরোনাম, বার্তাগুলো এবং কথোপকথনটি ব্যবহারকারীদের একটি গোষ্ঠীর মধ্যে হচ্ছে কিনা, তা অন্তর্ভুক্ত থাকে।
কোনো কথোপকথনের আপডেট, যেমন নতুন বার্তা, সম্পর্কে ব্যবহারকারীদের জানাতে অ্যাপগুলো অ্যান্ড্রয়েড সিস্টেমে একটি Notification পোস্ট করে। এই Notification নোটিফিকেশন শেডে মেসেজিং-নির্দিষ্ট UI প্রদর্শন করার জন্য MessagingStyle অবজেক্ট ব্যবহার করে। অ্যান্ড্রয়েড প্ল্যাটফর্ম এই Notification অ্যান্ড্রয়েড অটোতেও পাঠায়, এবং এর MessagingStyle এক্সট্র্যাক্ট করে গাড়ির ডিসপ্লেতে একটি নোটিফিকেশন পোস্ট করার জন্য ব্যবহার করা হয়।
অ্যান্ড্রয়েড অটোতে অ্যাপগুলোকে একটি Notification Action অবজেক্ট যোগ করতে হয়, যাতে ব্যবহারকারী সরাসরি গাড়ির ডিসপ্লে থেকেই কোনো বার্তার উত্তর দিতে বা সেটিকে পঠিত হিসেবে চিহ্নিত করতে পারেন।
সংক্ষেপে, একটি একক কথোপকথন একটি Notification অবজেক্ট দ্বারা উপস্থাপিত হয়, যা একটি MessagingStyle অবজেক্ট দিয়ে স্টাইল করা থাকে। MessagingStyle মধ্যে সেই কথোপকথনের সমস্ত বার্তা এক বা একাধিক MessagingStyle.Message অবজেক্টে থাকে। এবং, Android Auto-এর সাথে সামঞ্জস্যপূর্ণ হতে, একটি অ্যাপকে অবশ্যই Notification সাথে reply এবং mark-as-read Action অবজেক্ট সংযুক্ত করতে হবে।
বার্তা প্রবাহ
এই অংশে আপনার অ্যাপ এবং অ্যান্ড্রয়েড অটোর মধ্যে একটি সাধারণ মেসেজিং প্রবাহ বর্ণনা করা হয়েছে।
- আপনার অ্যাপ একটি বার্তা পেয়েছে।
- আপনার অ্যাপটি রিপ্লাই এবং মার্ক-অ্যাজ-রিড
Actionঅবজেক্ট সহ একটিMessagingStyleনোটিফিকেশন তৈরি করে। - অ্যান্ড্রয়েড অটো অ্যান্ড্রয়েড সিস্টেম থেকে "নতুন নোটিফিকেশন" ইভেন্টটি গ্রহণ করে এবং
MessagingStyle, replyAction, ও mark-as-readActionখুঁজে বের করে। - অ্যান্ড্রয়েড অটো গাড়িতে একটি নোটিফিকেশন তৈরি করে প্রদর্শন করে।
- ব্যবহারকারী গাড়ির ডিসপ্লেতে থাকা নোটিফিকেশনটিতে ট্যাপ করলে, অ্যান্ড্রয়েড অটো ‘পঠিত হিসেবে চিহ্নিত করুন
Actionসক্রিয় করে।- ব্যাকগ্রাউন্ডে, আপনার অ্যাপকে অবশ্যই এই 'পঠিত হিসেবে চিহ্নিত করুন' ইভেন্টটি পরিচালনা করতে হবে।
- যদি ব্যবহারকারী ভয়েসের মাধ্যমে নোটিফিকেশনের উত্তর দেন, তাহলে অ্যান্ড্রয়েড অটো সেই উত্তরের একটি প্রতিলিপি রিপ্লাই
Actionরাখে এবং তারপর সেটি ট্রিগার করে।- ব্যাকগ্রাউন্ডে, আপনার অ্যাপকে অবশ্যই এই রিপ্লাই ইভেন্টটি হ্যান্ডেল করতে হবে।
প্রাথমিক অনুমান
এই পৃষ্ঠাটি আপনাকে একটি সম্পূর্ণ মেসেজিং অ্যাপ তৈরি করতে নির্দেশনা দেয় না। অ্যান্ড্রয়েড অটোর মাধ্যমে মেসেজিং সমর্থন শুরু করার আগে আপনার অ্যাপের জন্য প্রয়োজনীয় কিছু বিষয় নিম্নলিখিত কোড নমুনায় অন্তর্ভুক্ত করা হয়েছে:
data class YourAppConversation(
val id: Int,
val title: String,
val recipients: MutableList<YourAppUser>,
val icon: Bitmap) {
companion object {
/** Fetches [YourAppConversation] by its [id]. */
fun getById(id: Int): YourAppConversation = // ...
}
/** Replies to this conversation with the given [message]. */
fun reply(message: String) {}
/** Marks this conversation as read. */
fun markAsRead() {}
/** Retrieves all unread messages from this conversation. */
fun getUnreadMessages(): List<YourAppMessage> { return /* ... */ }
}
data class YourAppUser(val id: Int, val name: String, val icon: Uri)
data class YourAppMessage(
val id: Int,
val sender: YourAppUser,
val body: String,
val timeReceived: Long)
অ্যান্ড্রয়েড অটো সমর্থন ঘোষণা করুন
যখন অ্যান্ড্রয়েড অটো কোনো মেসেজিং অ্যাপ থেকে নোটিফিকেশন পায়, তখন এটি যাচাই করে দেখে যে অ্যাপটি অ্যান্ড্রয়েড অটোর জন্য সমর্থন ঘোষণা করেছে কি না। এই সমর্থনটি সক্রিয় করতে, আপনার অ্যাপের ম্যানিফেস্টে নিম্নলিখিত এন্ট্রিটি অন্তর্ভুক্ত করুন:
<application>
...
<meta-data
android:name="com.google.android.gms.car.application"
android:resource="@xml/automotive_app_desc"/>
...
</application>
এই ম্যানিফেস্ট এন্ট্রিটি automotive_app_desc.xml নামক আরেকটি XML ফাইলকে নির্দেশ করে, যেটি আপনাকে আপনার অ্যাপ মডিউলের res/xml ডিরেক্টরিতে তৈরি করতে হবে। automotive_app_desc.xml ফাইলে, আপনার অ্যাপ যে অ্যান্ড্রয়েড অটো সক্ষমতাগুলো সমর্থন করে, তা ঘোষণা করুন। নোটিফিকেশনের জন্য সমর্থন ঘোষণা করতে, নিম্নলিখিতটি অন্তর্ভুক্ত করুন:
<automotiveApp>
<uses name="notification" />
</automotiveApp>
যদি আপনার অ্যাপকে ডিফল্ট এসএমএস হ্যান্ডলার হিসেবে সেট করা যায়, তাহলে অবশ্যই নিম্নলিখিত <uses> এলিমেন্টটি অন্তর্ভুক্ত করুন। যদি আপনি তা না করেন, তাহলে আপনার অ্যাপকে ডিফল্ট এসএমএস হ্যান্ডলার হিসেবে সেট করা হলে অ্যান্ড্রয়েড অটো আগত এসএমএস/এমএমএস বার্তাগুলি পরিচালনা করার জন্য তার অন্তর্নির্মিত ডিফল্ট হ্যান্ডলার ব্যবহার করে, যার ফলে ডুপ্লিকেট নোটিফিকেশন আসতে পারে।
<automotiveApp>
...
<uses name="sms" />
</automotiveApp>
AndroidX কোর লাইব্রেরি আমদানি করুন
অ্যান্ড্রয়েড অটো-তে ব্যবহারের জন্য নোটিফিকেশন তৈরি করতে AndroidX কোর লাইব্রেরি প্রয়োজন। নিম্নলিখিতভাবে আপনার প্রজেক্টে লাইব্রেরিটি ইম্পোর্ট করুন:
- শীর্ষ-স্তরের
build.gradleফাইলে, গুগলের মেভেন রিপোজিটরির উপর একটি ডিপেন্ডেন্সি অন্তর্ভুক্ত করুন, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:
গ্রুভি
allprojects { repositories { google() } }
কোটলিন
allprojects { repositories { google() } }
- আপনার অ্যাপ মডিউলের
build.gradleফাইলে, নিচের উদাহরণে দেখানো অনুযায়ী AndroidX Core লাইব্রেরি ডিপেন্ডেন্সিটি অন্তর্ভুক্ত করুন:
গ্রুভি
dependencies { // If your app is written in Java implementation 'androidx.core:core:1.19.0' // If your app is written in Kotlin implementation 'androidx.core:core-ktx:1.19.0' }
কোটলিন
dependencies { // If your app is written in Java implementation("androidx.core:core:1.19.0") // If your app is written in Kotlin implementation("androidx.core:core-ktx:1.19.0") }
ব্যবহারকারীর কার্যকলাপ পরিচালনা করুন
আপনার মেসেজিং অ্যাপে একটি Action মাধ্যমে কথোপকথন আপডেট করার একটি উপায় থাকা প্রয়োজন। অ্যান্ড্রয়েড অটোর জন্য, আপনার অ্যাপকে দুই ধরনের Action অবজেক্ট পরিচালনা করতে হবে: রিপ্লাই এবং মার্ক-অ্যাজ-রিড। আমরা এগুলোকে একটি IntentService ব্যবহার করে পরিচালনা করার পরামর্শ দিই, যা ব্যাকগ্রাউন্ডে সম্ভাব্য ব্যয়বহুল কলগুলো পরিচালনা করার সুবিধা দেয় এবং আপনার অ্যাপের প্রধান থ্রেডকে মুক্ত রাখে।
অভিপ্রায়মূলক ক্রিয়া সংজ্ঞায়িত করুন
Intent অ্যাকশন হলো আপনার পছন্দের কিছু সাধারণ স্ট্রিং, যা Intent উদ্দেশ্য শনাক্ত করে। যেহেতু একটিমাত্র সার্ভিস একাধিক ধরনের ইনটেন্ট পরিচালনা করতে পারে, তাই একাধিক IntentService কম্পোনেন্ট সংজ্ঞায়িত করার পরিবর্তে একাধিক অ্যাকশন স্ট্রিং সংজ্ঞায়িত করা সহজতর।
এই গাইডের উদাহরণ মেসেজিং অ্যাপটিতে দুই ধরনের প্রয়োজনীয় অ্যাকশন রয়েছে: রিপ্লাই এবং মার্ক-অ্যাজ-রিড, যা নিচের কোড স্যাম্পলে দেখানো হয়েছে:
private const val ACTION_REPLY = "com.example.REPLY"
private const val ACTION_MARK_AS_READ = "com.example.MARK_AS_READ"
পরিষেবাটি তৈরি করুন
এই Action অবজেক্টগুলো পরিচালনা করার জন্য একটি সার্ভিস তৈরি করতে, আপনার কনভারসেশন আইডি প্রয়োজন, যা আপনার অ্যাপ দ্বারা সংজ্ঞায়িত একটি যথেচ্ছ ডেটা স্ট্রাকচার এবং যা কথোপকথনটিকে শনাক্ত করে। আপনার একটি রিমোট ইনপুট কী-ও প্রয়োজন, যা এই বিভাগে পরে বিস্তারিতভাবে আলোচনা করা হয়েছে। নিম্নলিখিত কোড নমুনাটি প্রয়োজনীয় অ্যাকশনগুলো পরিচালনা করার জন্য একটি সার্ভিস তৈরি করে:
private const val EXTRA_CONVERSATION_ID_KEY = "conversation_id"
private const val REMOTE_INPUT_RESULT_KEY = "reply_input"
/**
* An [IntentService] that handles reply and mark-as-read actions for
* [YourAppConversation]s.
*/
class MessagingService : IntentService("MessagingService") {
override fun onHandleIntent(intent: Intent?) {
// Fetches internal data.
val conversationId = intent!!.getIntExtra(EXTRA_CONVERSATION_ID_KEY, -1)
// Searches the database for that conversation.
val conversation = YourAppConversation.getById(conversationId)
// Handles the action that was requested in the intent. The TODOs
// are addressed in a later section.
when (intent.action) {
ACTION_REPLY -> TODO()
ACTION_MARK_AS_READ -> TODO()
}
}
}
এই সার্ভিসটিকে আপনার অ্যাপের সাথে যুক্ত করতে, আপনাকে আপনার অ্যাপের ম্যানিফেস্টেও সার্ভিসটি রেজিস্টার করতে হবে, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:
<application>
<service android:name="com.example.MessagingService" />
...
</application>
ইনটেন্ট তৈরি এবং পরিচালনা করুন
অ্যান্ড্রয়েড অটো সহ অন্যান্য অ্যাপগুলো MessagingService ট্রিগার করে এমন Intent পেতে পারে না, কারণ Intent-গুলো PendingIntent মাধ্যমে অন্যান্য অ্যাপে পাঠানো হয়। এই সীমাবদ্ধতার কারণে, অন্যান্য অ্যাপকে আপনার অ্যাপে উত্তরের টেক্সট পাঠানোর সুযোগ দিতে একটি RemoteInput অবজেক্ট তৈরি করুন, যেমনটি নিচের উদাহরণে দেখানো হয়েছে:
/**
* Creates a [RemoteInput] that lets remote apps provide a response string
* to the underlying [Intent] within a [PendingIntent].
*/
fun createReplyRemoteInput(context: Context): RemoteInput {
// RemoteInput.Builder accepts a single parameter: the key to use to store
// the response in.
return RemoteInput.Builder(REMOTE_INPUT_RESULT_KEY).build()
// Note that the RemoteInput has no knowledge of the conversation. This is
// because the data for the RemoteInput is bound to the reply Intent using
// static methods in the RemoteInput class.
}
/** Creates an [Intent] that handles replying to the given [appConversation]. */
fun createReplyIntent(
context: Context, appConversation: YourAppConversation): Intent {
// Creates the intent backed by the MessagingService.
val intent = Intent(context, MessagingService::class.java)
// Lets the MessagingService know this is a reply request.
intent.action = ACTION_REPLY
// Provides the ID of the conversation that the reply applies to.
intent.putExtra(EXTRA_CONVERSATION_ID_KEY, appConversation.id)
return intent
}
MessagingService এর ACTION_REPLY সুইচ ক্লজে, রিপ্লাই Intent জন্য প্রয়োজনীয় তথ্যগুলো এক্সট্র্যাক্ট করুন, যেমনটি নিচের উদাহরণে দেখানো হয়েছে:
ACTION_REPLY -> {
// Extracts reply response from the intent using the same key that the
// RemoteInput uses.
val results: Bundle = RemoteInput.getResultsFromIntent(intent)
val message = results.getString(REMOTE_INPUT_RESULT_KEY)
// This conversation object comes from the MessagingService.
conversation.reply(message)
}
আপনি 'mark-as-read' Intent একইভাবে পরিচালনা করবেন। তবে, এর জন্য কোনো RemoteInput প্রয়োজন হয় না, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:
/** Creates an [Intent] that handles marking the [appConversation] as read. */
fun createMarkAsReadIntent(
context: Context, appConversation: YourAppConversation): Intent {
val intent = Intent(context, MessagingService::class.java)
intent.action = ACTION_MARK_AS_READ
intent.putExtra(EXTRA_CONVERSATION_ID_KEY, appConversation.id)
return intent
}
নিম্নলিখিত উদাহরণে যেমন দেখানো হয়েছে, MessagingService মধ্যে থাকা ACTION_MARK_AS_READ সুইচ ক্লজটির জন্য আর কোনো লজিকের প্রয়োজন নেই:
// Marking as read has no other logic.
ACTION_MARK_AS_READ -> conversation.markAsRead()
ব্যবহারকারীদের বার্তা সম্পর্কে অবহিত করুন
কথোপকথনের কার্যক্রম পরিচালনা সম্পন্ন হয়ে গেলে, পরবর্তী ধাপ হলো অ্যান্ড্রয়েড অটো-সম্মত নোটিফিকেশন তৈরি করা।
অ্যাকশন তৈরি করুন
মূল অ্যাপের মেথডগুলো চালু করার জন্য Notification ব্যবহার করে Action অবজেক্ট অন্য অ্যাপে পাঠানো যায়। এভাবেই অ্যান্ড্রয়েড অটো কোনো কথোপকথনকে পঠিত হিসেবে চিহ্নিত করতে বা তার উত্তর দিতে পারে।
একটি Action তৈরি করতে, প্রথমে একটি Intent তৈরি করুন। পূর্ববর্তী বিভাগের createReplyIntent() মেথডটি ব্যবহার করে কীভাবে একটি 'reply' Intent তৈরি করতে হয়, তা নিচের উদাহরণে দেখানো হলো:
fun createReplyAction(
context: Context, appConversation: YourAppConversation): Action {
val replyIntent: Intent = createReplyIntent(context, appConversation)
// ...
এরপর, এই Intent একটি PendingIntent মধ্যে রাখুন, যা এটিকে বাইরের কোনো অ্যাপের ব্যবহারের জন্য প্রস্তুত করে। একটি PendingIntent মোড়ানো Intent টির সমস্ত অ্যাক্সেস বন্ধ করে দেয়, কারণ এটি শুধুমাত্র কিছু নির্দিষ্ট মেথড উন্মুক্ত রাখে যা গ্রহণকারী অ্যাপকে Intent টি চালু করতে বা প্রেরক অ্যাপের প্যাকেজ নেম পেতে সাহায্য করে। বাইরের অ্যাপটি মূল Intent বা এর ভেতরের ডেটা অ্যাক্সেস করতে পারে না।
// ...
val replyPendingIntent = PendingIntent.getService(
context,
createReplyId(appConversation), // Method explained later.
replyIntent,
PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_MUTABLE)
// ...
রিপ্লাই Action সেট আপ করার আগে জেনে রাখুন যে, অ্যান্ড্রয়েড অটো-র এই Action জন্য তিনটি পূর্বশর্ত রয়েছে:
- সিমান্টিক অ্যাকশন অবশ্যই
Action.SEMANTIC_ACTION_REPLYতে সেট করতে হবে। -
Actionঅবশ্যই উল্লেখ করতে হবে যে, এটি চালু হলে কোনো ইউজার ইন্টারফেস দেখানো হবে না। -
Actionঅবশ্যই একটিমাত্রRemoteInputথাকতে হবে।
নিম্নলিখিত কোড নমুনাটি একটি প্রত্যুত্তর Action সেট আপ করে যা পূর্বে তালিকাভুক্ত প্রয়োজনীয়তাগুলি পূরণ করে:
// ...
val replyAction = Action.Builder(R.drawable.reply, "Reply", replyPendingIntent)
// Provides context to what firing the Action does.
.setSemanticAction(Action.SEMANTIC_ACTION_REPLY)
// The action doesn't show any UI, as required by Android Auto.
.setShowsUserInterface(false)
// Don't forget the reply RemoteInput. Android Auto will use this to
// make a system call that will add the response string into
// the reply intent so it can be extracted by the messaging app.
.addRemoteInput(createReplyRemoteInput(context))
.build()
return replyAction
}
পড়া হিসেবে চিহ্নিত করার অ্যাকশনটি পরিচালনা করার পদ্ধতিও একই রকম, তবে এক্ষেত্রে কোনো RemoteInput নেই। তাই, Android Auto-এর পড়া হিসেবে চিহ্নিত করার Action জন্য দুটি পূর্বশর্ত রয়েছে:
- সিমান্টিক অ্যাকশনটি
Action.SEMANTIC_ACTION_MARK_AS_READহিসেবে সেট করা হয়েছে। - এই অ্যাকশনটি নির্দেশ করে যে, এটি চালু হলে কোনো ইউজার ইন্টারফেস দেখানো হবে না।
নিম্নলিখিত কোড নমুনাটি একটি 'পঠিত হিসাবে চিহ্নিত করুন' Action সেট আপ করে যা এই প্রয়োজনীয়তাগুলি পূরণ করে:
fun createMarkAsReadAction(
context: Context, appConversation: YourAppConversation): Action {
val markAsReadIntent = createMarkAsReadIntent(context, appConversation)
val markAsReadPendingIntent = PendingIntent.getService(
context,
createMarkAsReadId(appConversation), // Method explained later.
markAsReadIntent,
PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE)
val markAsReadAction = Action.Builder(
R.drawable.mark_as_read, "Mark as Read", markAsReadPendingIntent)
.setSemanticAction(Action.SEMANTIC_ACTION_MARK_AS_READ)
.setShowsUserInterface(false)
.build()
return markAsReadAction
}
পেন্ডিং ইন্টেন্ট তৈরি করার সময়, আপনি দুটি মেথড ব্যবহার করেন: createReplyId এবং createMarkAsReadId । এই মেথডগুলো প্রতিটি PendingIntent জন্য রিকোয়েস্ট কোড হিসেবে কাজ করে, যা অ্যান্ড্রয়েড বিদ্যমান পেন্ডিং ইন্টেন্টগুলো নিয়ন্ত্রণ করতে ব্যবহার করে। create মেথডগুলোকে অবশ্যই প্রতিটি কথোপকথনের জন্য একটি অনন্য আইডি রিটার্ন করতে হবে, কিন্তু একই কথোপকথনের জন্য বারবার কল করলে অবশ্যই আগে থেকে তৈরি করা অনন্য আইডিটি রিটার্ন করতে হবে।
A এবং B নামক দুটি কথোপকথনের একটি উদাহরণ বিবেচনা করুন: কথোপকথন A-এর রিপ্লাই আইডি হলো 100, এবং এর মার্ক-অ্যাজ-রিড আইডি হলো 101। কথোপকথন B-এর রিপ্লাই আইডি হলো 102, এবং এর মার্ক-অ্যাজ-রিড আইডি হলো 103। যদি কথোপকথন A আপডেট করা হয়, তাহলেও রিপ্লাই এবং মার্ক-অ্যাজ-রিড আইডি যথাক্রমে 100 এবং 101-ই থাকবে। আরও তথ্যের জন্য, PendingIntent.FLAG_UPDATE_CURRENT দেখুন।
একটি মেসেজিং স্টাইল তৈরি করুন
MessagingStyle হলো মেসেজিং তথ্যের বাহক এবং অ্যান্ড্রয়েড অটো একটি কথোপকথনের প্রতিটি মেসেজ উচ্চস্বরে পড়ে শোনানোর জন্য এটি ব্যবহার করে।
প্রথমে, আপনাকে ডিভাইসের ব্যবহারকারীকে একটি Person অবজেক্ট হিসেবে নির্দিষ্ট করতে হবে, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:
fun createMessagingStyle(
context: Context, appConversation: YourAppConversation): MessagingStyle {
// Method defined by the messaging app.
val appDeviceUser: YourAppUser = getAppDeviceUser()
val devicePerson = Person.Builder()
// The display name (also the name that's read aloud in Android auto).
.setName(appDeviceUser.name)
// The icon to show in the notification shade in the system UI (outside
// of Android Auto).
.setIcon(appDeviceUser.icon)
// A unique key in case there are multiple people in this conversation with
// the same name.
.setKey(appDeviceUser.id)
.build()
// ...
এরপর আপনি MessagingStyle অবজেক্টটি তৈরি করতে পারেন এবং কথোপকথনটি সম্পর্কে কিছু বিবরণ প্রদান করতে পারেন।
// ...
val messagingStyle = MessagingStyle(devicePerson)
// Sets the conversation title. If the app's target version is lower
// than P, this will automatically mark the conversation as a group (to
// maintain backward compatibility). Use `setGroupConversation` after
// setting the conversation title to explicitly override this behavior. See
// the documentation for more information.
messagingStyle.setConversationTitle(appConversation.title)
// Group conversation means there is more than 1 recipient, so set it as such.
messagingStyle.setGroupConversation(appConversation.recipients.size > 1)
// ...
সবশেষে, অপঠিত বার্তাগুলো যোগ করুন।
// ...
for (appMessage in appConversation.getUnreadMessages()) {
// The sender is also represented using a Person object.
val senderPerson = Person.Builder()
.setName(appMessage.sender.name)
.setIcon(appMessage.sender.icon)
.setKey(appMessage.sender.id)
.build()
// Adds the message. More complex messages, like images,
// can be created and added by instantiating the MessagingStyle.Message
// class directly. See documentation for details.
messagingStyle.addMessage(
appMessage.body, appMessage.timeReceived, senderPerson)
}
return messagingStyle
}
প্যাকেজ করুন এবং বিজ্ঞপ্তিটি পাঠান
Action এবং MessagingStyle অবজেক্টগুলো তৈরি করার পর, আপনি Notification তৈরি ও পোস্ট করতে পারেন।
fun notify(context: Context, appConversation: YourAppConversation) {
// Creates the actions and MessagingStyle.
val replyAction = createReplyAction(context, appConversation)
val markAsReadAction = createMarkAsReadAction(context, appConversation)
val messagingStyle = createMessagingStyle(context, appConversation)
// Creates the notification.
val notification = NotificationCompat.Builder(context, channel)
// A required field for the Android UI.
.setSmallIcon(R.drawable.notification_icon)
// Shows in Android Auto as the conversation image.
.setLargeIcon(appConversation.icon)
// Adds MessagingStyle.
.setStyle(messagingStyle)
// Adds reply action.
.addAction(replyAction)
// Makes the mark-as-read action invisible, so it doesn't appear
// in the Android UI but the app satisfies Android Auto's
// mark-as-read Action requirement. Both required actions can be made
// visible or invisible; it is a stylistic choice.
.addInvisibleAction(markAsReadAction)
.build()
// Posts the notification for the user to see.
val notificationManagerCompat = NotificationManagerCompat.from(context)
notificationManagerCompat.notify(appConversation.id, notification)
}
অতিরিক্ত সম্পদ
অ্যান্ড্রয়েড অটো মেসেজিং নোটিফিকেশন সমস্যা রিপোর্ট করুন
অ্যান্ড্রয়েড অটোর জন্য মেসেজিং নোটিফিকেশন তৈরি করার সময় যদি কোনো সমস্যার সম্মুখীন হন, তাহলে আপনি গুগল ইস্যু ট্র্যাকার ব্যবহার করে তা জানাতে পারেন। ইস্যু টেমপ্লেটে অনুরোধ করা সমস্ত তথ্য অবশ্যই পূরণ করবেন।
নতুন কোনো সমস্যা জানানোর আগে, সেটি সমস্যার তালিকায় আগে থেকেই আছে কিনা তা দেখে নিন। ট্র্যাকারে কোনো সমস্যার তারকাচিহ্নে ক্লিক করে আপনি সেটিতে সাবস্ক্রাইব করতে এবং ভোট দিতে পারেন। আরও তথ্যের জন্য, ‘একটি সমস্যায় সাবস্ক্রাইব করা’ দেখুন।