Android Auto-এর জন্য মেসেজিং অ্যাপ তৈরি করুন

যোগাযোগ বিভাগ শীঘ্রই আসছে
বার্তার ইতিহাস এবং কল করার অভিজ্ঞতা সহ নতুন ক্ষমতাগুলির জন্য সমর্থন অন্তর্ভুক্ত করতে বার্তাপ্রেরণ বিভাগটি প্রসারিত করা হচ্ছে

বার্তার মাধ্যমে সংযুক্ত থাকা অনেক ড্রাইভারের জন্য গুরুত্বপূর্ণ। চ্যাট অ্যাপগুলি ব্যবহারকারীদের জানাতে পারে যে কোনও শিশুকে তুলে নেওয়ার প্রয়োজন আছে কিনা বা ডিনারের অবস্থান পরিবর্তন করা হয়েছে কিনা। অ্যান্ড্রয়েড ফ্রেমওয়ার্ক একটি স্ট্যান্ডার্ড ইউজার ইন্টারফেস ব্যবহার করে মেসেজিং অ্যাপগুলিকে তাদের পরিষেবাগুলিকে ড্রাইভিং অভিজ্ঞতায় প্রসারিত করতে দেয় যা চালকদের রাস্তায় তাদের চোখ রাখতে দেয়।

যে অ্যাপগুলি মেসেজিং সমর্থন করে সেগুলি তাদের মেসেজিং বিজ্ঞপ্তিগুলিকে প্রসারিত করতে পারে যাতে Android Auto অটো চলাকালীন সেগুলি ব্যবহার করতে দেয়৷ এই বিজ্ঞপ্তিগুলি স্বয়ংক্রিয়ভাবে প্রদর্শিত হয় এবং ব্যবহারকারীদের একটি সামঞ্জস্যপূর্ণ, কম-বিক্ষেপ ইন্টারফেসে বার্তা পড়তে এবং প্রতিক্রিয়া জানাতে দেয়। এবং আপনি যখন MessagingStyle API ব্যবহার করেন, তখন আপনি Android Auto সহ সমস্ত Android ডিভাইসের জন্য অপ্টিমাইজ করা বার্তা বিজ্ঞপ্তিগুলি পান৷ অপ্টিমাইজেশানগুলির মধ্যে একটি UI অন্তর্ভুক্ত যা বার্তা বিজ্ঞপ্তি, উন্নত অ্যানিমেশন এবং ইনলাইন চিত্রগুলির জন্য সমর্থনের জন্য বিশেষ।

এই নির্দেশিকাটি আপনাকে দেখায় যে কীভাবে একটি অ্যাপ প্রসারিত করতে হয় যা ব্যবহারকারীর কাছে বার্তা প্রদর্শন করে এবং ব্যবহারকারীর উত্তর গ্রহণ করে, যেমন একটি চ্যাট অ্যাপ, বার্তা প্রদর্শন এবং উত্তরের রসিদ একটি অটো ডিভাইসে তুলে দিতে। সম্পর্কিত ডিজাইন নির্দেশিকা জন্য, ড্রাইভিং সাইটের জন্য ডিজাইনে মেসেজিং অ্যাপস দেখুন।

এবার শুরু করা যাক

অটো ডিভাইসের জন্য মেসেজিং পরিষেবা প্রদান করতে, আপনার অ্যাপটিকে অবশ্যই ম্যানিফেস্টে Android Auto-এর জন্য সমর্থন ঘোষণা করতে হবে এবং নিম্নলিখিতগুলি করতে সক্ষম হবে:

  • NotificationCompat.MessagingStyle অবজেক্ট তৈরি করুন এবং পাঠান যাতে উত্তর এবং মার্ক-এ-রিড Action অবজেক্ট থাকে।
  • একটি Service সাথে একটি কথোপকথন পঠিত হিসাবে উত্তর দেওয়া এবং চিহ্নিত করা পরিচালনা করুন৷

ধারণা এবং বস্তু

আপনি আপনার অ্যাপ ডিজাইন করা শুরু করার আগে, Android Auto কীভাবে মেসেজিং পরিচালনা করে তা বোঝা সহায়ক।

যোগাযোগের একটি পৃথক অংশকে একটি বার্তা বলা হয় এবং MessagingStyle.Message ক্লাস দ্বারা প্রতিনিধিত্ব করা হয়। একটি বার্তায় একজন প্রেরক, বার্তার বিষয়বস্তু এবং বার্তাটি পাঠানোর সময় থাকে।

ব্যবহারকারীদের মধ্যে যোগাযোগ একটি কথোপকথন বলা হয় এবং একটি MessagingStyle বস্তু দ্বারা প্রতিনিধিত্ব করা হয়. একটি কথোপকথন, বা MessagingStyle , একটি শিরোনাম, বার্তাগুলি এবং কথোপকথনটি ব্যবহারকারীদের একটি গোষ্ঠীর মধ্যে রয়েছে কিনা তা থাকে৷

একটি কথোপকথনের আপডেট সম্পর্কে ব্যবহারকারীদের অবহিত করতে, যেমন একটি নতুন বার্তা, অ্যাপগুলি Android সিস্টেমে একটি Notification পোস্ট করে৷ এই Notification MessagingStyle অবজেক্ট ব্যবহার করে নোটিফিকেশন শেডে মেসেজিং-নির্দিষ্ট UI প্রদর্শন করতে। অ্যান্ড্রয়েড প্ল্যাটফর্মটি অ্যান্ড্রয়েড অটোতেও এই Notification পাস করে এবং MessagingStyle বের করা হয় এবং গাড়ির ডিসপ্লের মাধ্যমে একটি বিজ্ঞপ্তি পোস্ট করতে ব্যবহৃত হয়।

ব্যবহারকারীকে দ্রুত একটি বার্তার উত্তর দিতে বা বিজ্ঞপ্তি শেড থেকে সরাসরি পঠিত হিসাবে চিহ্নিত করার জন্য Android Auto-এর জন্য অ্যাপ্লিকেশনগুলিকে একটি Notification Action অবজেক্ট যুক্ত করার প্রয়োজন হয়৷

সংক্ষেপে, একটি একক কথোপকথন একটি Notification অবজেক্ট দ্বারা প্রতিনিধিত্ব করা হয় যা একটি MessagingStyle অবজেক্টের সাথে স্টাইল করা হয়। MessagingStyle সেই কথোপকথনের মধ্যে থাকা সমস্ত বার্তা এক বা একাধিক MessagingStyle.Message অবজেক্টে থাকে। এবং, অ্যান্ড্রয়েড অটো কমপ্লায়েন্ট হওয়ার জন্য, একটি অ্যাপকে অবশ্যই রিপ্লাই সংযুক্ত করতে হবে এবং Notification Action অবজেক্টকে রিড-এ মার্ক করতে হবে।

বার্তা প্রবাহ

এই বিভাগটি আপনার অ্যাপ এবং অ্যান্ড্রয়েড অটোর মধ্যে একটি সাধারণ বার্তাপ্রবাহের বর্ণনা দেয়।

  1. আপনার অ্যাপ একটি বার্তা পায়।
  2. আপনার অ্যাপ উত্তর এবং মার্ক-এ-রিড Action অবজেক্ট সহ একটি MessagingStyle বিজ্ঞপ্তি তৈরি করে।
  3. অ্যান্ড্রয়েড অটো অ্যান্ড্রয়েড সিস্টেম থেকে "নতুন বিজ্ঞপ্তি" ইভেন্ট গ্রহণ করে এবং MessagingStyle , উত্তর Action এবং মার্ক-এ-রিড Action খুঁজে পায়।
  4. Android Auto গাড়িতে একটি বিজ্ঞপ্তি জেনারেট করে এবং প্রদর্শন করে।
  5. ব্যবহারকারী গাড়ির ডিসপ্লেতে বিজ্ঞপ্তিটি ট্যাপ করলে, Android Auto মার্ক-এ-রিড Action ট্রিগার করে।
    • ব্যাকগ্রাউন্ডে, আপনার অ্যাপটিকে এই মার্ক-এ-পঠিত ইভেন্টটি পরিচালনা করতে হবে।
  6. ব্যবহারকারী যদি ভয়েস ব্যবহার করে বিজ্ঞপ্তিতে সাড়া দেয়, তাহলে Android Auto ব্যবহারকারীর প্রতিক্রিয়ার একটি ট্রান্সক্রিপশন রিপ্লাই Action রাখে এবং তারপর এটি ট্রিগার করে।
    • পটভূমিতে, আপনার অ্যাপটিকে অবশ্যই এই উত্তর ইভেন্টটি পরিচালনা করতে হবে।

প্রাথমিক অনুমান

এই পৃষ্ঠাটি আপনাকে একটি সম্পূর্ণ মেসেজিং অ্যাপ তৈরি করতে নির্দেশনা দেয় না। নিম্নলিখিত কোড নমুনায় Android Auto-এর সাথে মেসেজিং সমর্থন করা শুরু করার আগে আপনার অ্যাপের প্রয়োজনীয় কিছু জিনিস অন্তর্ভুক্ত রয়েছে:

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)

Android Auto সমর্থন ঘোষণা করুন

যখন Android Auto একটি মেসেজিং অ্যাপ থেকে একটি বিজ্ঞপ্তি পায়, তখন এটি পরীক্ষা করে যে অ্যাপটি Android Auto-এর জন্য সমর্থন ঘোষণা করেছে। এই সমর্থন সক্ষম করতে, আপনার অ্যাপের ম্যানিফেস্টে নিম্নলিখিত এন্ট্রি অন্তর্ভুক্ত করুন:

<application>
    ...
    <meta-data
        android:name="com.google.android.gms.car.application"
        android:resource="@xml/automotive_app_desc"/>
    ...
</application>

এই ম্যানিফেস্ট এন্ট্রিটি অন্য একটি XML ফাইলকে নির্দেশ করে যা আপনাকে নিম্নলিখিত পাথ দিয়ে তৈরি করতে হবে: YourAppProject/app/src/main/res/xml/automotive_app_desc.xmlautomotive_app_desc.xml এ আপনার অ্যাপ সমর্থন করে এমন Android Auto সক্ষমতা ঘোষণা করুন। উদাহরণস্বরূপ, বিজ্ঞপ্তিগুলির জন্য সমর্থন ঘোষণা করতে, নিম্নলিখিতগুলি অন্তর্ভুক্ত করুন:

<automotiveApp>
    <uses name="notification" />
</automotiveApp>

যদি আপনার অ্যাপটিকে ডিফল্ট এসএমএস হ্যান্ডলার হিসেবে সেট করা যায়, তাহলে নিচের <uses> উপাদানটি অন্তর্ভুক্ত করতে ভুলবেন না। আপনি যদি তা না করেন, আপনার অ্যাপটিকে ডিফল্ট এসএমএস হ্যান্ডলার হিসাবে সেট করা হলে, Android Auto-এ অন্তর্নির্মিত একটি ডিফল্ট হ্যান্ডলার ইনকামিং SMS/MMS বার্তাগুলি পরিচালনা করতে ব্যবহার করা হবে, যার ফলে ডুপ্লিকেট বিজ্ঞপ্তি আসতে পারে৷

<automotiveApp>
    ...
    <uses name="sms" />
</automotiveApp>

AndroidX কোর লাইব্রেরি আমদানি করুন

স্বয়ংক্রিয় ডিভাইসগুলির সাথে ব্যবহারের জন্য বিল্ডিং বিজ্ঞপ্তিগুলির জন্য AndroidX কোর লাইব্রেরি প্রয়োজন৷ নিম্নরূপ আপনার প্রকল্পে লাইব্রেরি আমদানি করুন:

  1. শীর্ষ-স্তরের build.gradle ফাইলে, Google এর Maven সংগ্রহস্থলের উপর নির্ভরতা অন্তর্ভুক্ত করুন, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

গ্রোভি

allprojects {
    repositories {
        google()
    }
}

কোটলিন

allprojects {
    repositories {
        google()
    }
}
  1. আপনার অ্যাপ মডিউলের build.gradle ফাইলে, AndroidX কোর লাইব্রেরি নির্ভরতা অন্তর্ভুক্ত করুন, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

গ্রোভি

dependencies {
    // If your app is written in Java
    implementation 'androidx.core:core:1.13.1'

    // If your app is written in Kotlin
    implementation 'androidx.core:core-ktx:1.13.1'
}

কোটলিন

dependencies {
    // If your app is written in Java
    implementation("androidx.core:core:1.13.1")

    // If your app is written in Kotlin
    implementation("androidx.core:core-ktx:1.13.1")
}

ব্যবহারকারীর ক্রিয়াকলাপ পরিচালনা করুন

আপনার মেসেজিং অ্যাপের একটি 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 পাওয়ার জন্য Android Auto সহ অন্যান্য অ্যাপের কোন উপায় নেই, কারণ 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)
}

আপনি একইভাবে মার্ক-এ-রিড 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()

বার্তা ব্যবহারকারীদের অবহিত করুন

একবার কথোপকথন অ্যাকশন হ্যান্ডলিং সম্পূর্ণ হয়ে গেলে, পরবর্তী ধাপ হল Android Auto কমপ্লায়েন্ট বিজ্ঞপ্তি তৈরি করা।

কর্ম তৈরি করুন

মূল অ্যাপে পদ্ধতিগুলি ট্রিগার করার জন্য একটি Notification ব্যবহার করে Action অবজেক্টগুলি অন্য অ্যাপগুলিতে প্রেরণ করা যেতে পারে। এইভাবে Android Auto একটি কথোপকথনকে পঠিত বা এর উত্তর হিসাবে চিহ্নিত করতে পারে৷

একটি Action তৈরি করতে, একটি Intent দিয়ে শুরু করুন। নিম্নলিখিত উদাহরণ দেখায় কিভাবে একটি "উত্তর" 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 সেট আপ করার আগে, জেনে রাখুন যে Android Auto-এর উত্তর Action জন্য তিনটি প্রয়োজনীয়তা রয়েছে:

  • শব্দার্থিক ক্রিয়া অবশ্যই Action.SEMANTIC_ACTION_REPLY সেট করতে হবে।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 ছাড়া মার্ক-এ-পঠিত ক্রিয়াটি পরিচালনা করা একই রকম। তাই মার্ক-এ-রিড Action জন্য Android Auto-এর দুটি প্রয়োজনীয়তা রয়েছে:

  • শব্দার্থিক ক্রিয়াটি Action.SEMANTIC_ACTION_MARK_AS_READ সেট করা হয়েছে।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 below.
            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 এর জন্য অনুরোধ কোড হিসাবে কাজ করে, যা বিদ্যমান মুলতুবি থাকা ইন্টেন্টগুলিকে নিয়ন্ত্রণ করতে Android দ্বারা ব্যবহৃত হয়। create() পদ্ধতিগুলিকে অবশ্যই প্রতিটি কথোপকথনের জন্য অনন্য আইডি ফেরত দিতে হবে, তবে একই কথোপকথনের জন্য বারবার কল করার জন্য অবশ্যই ইতিমধ্যে তৈরি হওয়া অনন্য আইডিটি ফেরত দিতে হবে।

দুটি কথোপকথনের একটি উদাহরণ বিবেচনা করুন, A এবং B: কথোপকথন A এর উত্তর আইডি হল 100, এবং এটির মার্ক-এ-রিড আইডি হল 101। কথোপকথন B-এর উত্তর আইডি হল 102, এবং এটির মার্ক-এ-রিড আইডি হল 103। কথোপকথন হলে A আপডেট করা হয়েছে, উত্তর এবং মার্ক-এ-পঠিত আইডি এখনও 100 এবং 101। আরও তথ্যের জন্য, PendingIntent.FLAG_UPDATE_CURRENT দেখুন।

একটি মেসেজিং স্টাইল তৈরি করুন

MessagingStyle হল মেসেজিং তথ্যের বাহক এবং যা Android Auto কথোপকথনে প্রতিটি বার্তা জোরে জোরে পড়ার জন্য ব্যবহার করে।

প্রথমে, ডিভাইসের ব্যবহারকারীকে একটি 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)
}

অতিরিক্ত সম্পদ

একটি Android Auto মেসেজিং সমস্যা রিপোর্ট করুন

অ্যান্ড্রয়েড অটোর জন্য আপনার মেসেজিং অ্যাপ ডেভেলপ করার সময় আপনি যদি কোনো সমস্যার সম্মুখীন হন, আপনি Google ইস্যু ট্র্যাকার ব্যবহার করে রিপোর্ট করতে পারেন। ইস্যু টেমপ্লেটে অনুরোধ করা সমস্ত তথ্য পূরণ করতে ভুলবেন না।

একটি নতুন সমস্যা তৈরি করুন

একটি নতুন সমস্যা ফাইল করার আগে, এটি ইতিমধ্যেই সমস্যা তালিকায় রিপোর্ট করা আছে কিনা তা পরীক্ষা করে দেখুন। আপনি সাবস্ক্রাইব করতে পারেন এবং ট্র্যাকারে একটি সমস্যার জন্য তারকা ক্লিক করে সমস্যার জন্য ভোট দিতে পারেন। আরও তথ্যের জন্য, একটি ইস্যুতে সদস্যতা নেওয়া দেখুন।