สร้างแอปรับส่งข้อความสำหรับ Android Auto

หมวดหมู่การสื่อสารจะพร้อมใช้งานเร็วๆ นี้
เราจะขยายการให้บริการหมวดหมู่การรับส่งข้อความเพื่อให้รองรับความสามารถใหม่ๆ เช่น ประวัติข้อความและประสบการณ์การโทร

การเชื่อมต่อผ่านข้อความต่างๆ เป็นสิ่งสำคัญต่อผู้ขับขี่จำนวนมาก แอปในแชทช่วยให้ผู้ใช้ ทราบว่าต้องไปรับเด็กหรือมีการเปลี่ยนสถานที่รับประทานอาหารหรือไม่ เฟรมเวิร์ก Android ช่วยให้แอปรับส่งข้อความขยายความสามารถ บริการต่างๆ อย่างเช่น ประสบการณ์การขับรถได้โดยใช้อินเทอร์เฟซผู้ใช้มาตรฐาน ที่ช่วยให้ผู้ขับขี่สามารถ สายตาจดจ่อกับถนน

แอปที่รองรับการรับส่งข้อความจะขยายการแจ้งเตือนการรับส่งข้อความเพื่อให้ Android Auto ใช้งานได้ ใช้งานเมื่อ Auto ทำงานอยู่ การแจ้งเตือนเหล่านี้จะแสดงใน "อัตโนมัติ" และช่วยให้ผู้ใช้ อ่านและตอบกลับข้อความด้วยอินเทอร์เฟซที่สม่ำเสมอ ลดการรบกวนสมาธิ และเมื่อคุณใช้ MessagingStyle API คุณจะได้รับการแจ้งเตือนข้อความที่เพิ่มประสิทธิภาพสำหรับ Android ทุกรุ่น อุปกรณ์ ซึ่งรวมถึง Android Auto การเพิ่มประสิทธิภาพมี UI ที่มีไว้สำหรับ การแจ้งเตือนข้อความ ภาพเคลื่อนไหวที่ได้รับการปรับปรุง และการสนับสนุนรูปภาพที่แทรกในบรรทัด

คู่มือนี้จะแสดงวิธีขยายแอปที่แสดงข้อความแก่ผู้ใช้และ ได้รับการตอบกลับของผู้ใช้ เช่น แอปแชท เพื่อส่งข้อความด้วยมือและ ปิดใบตอบรับการตอบกลับไปยังอุปกรณ์ Auto แล้ว สำหรับคำแนะนำเกี่ยวกับการออกแบบที่เกี่ยวข้อง โปรดดูที่การรับส่งข้อความ แอป บนเว็บไซต์ออกแบบสำหรับขับรถ

เริ่มต้นใช้งาน

เพื่อให้บริการรับส่งข้อความสำหรับอุปกรณ์รถยนต์ แอปของคุณต้องประกาศ รองรับ Android Auto ในไฟล์ Manifest และสามารถทำสิ่งต่อไปนี้ได้

  • สร้างและส่ง NotificationCompat.MessagingStyle ออบเจ็กต์ที่มีออบเจ็กต์ตอบกลับและทำเครื่องหมายว่าอ่านแล้ว Action
  • จัดการการตอบกลับและทำเครื่องหมายการสนทนาว่าอ่านแล้วด้วย Service

แนวคิดและวัตถุ

ก่อนที่จะเริ่มออกแบบแอป คุณควรเข้าใจว่า Android Auto จัดการการรับส่งข้อความ

กลุ่มการสื่อสารแต่ละกลุ่มเรียกว่าข้อความ และนำเสนอด้วย คลาส MessagingStyle.Message ข้อความจะมีผู้ส่ง ข้อความคือ เนื้อหาและเวลาที่ส่งข้อความ

การสื่อสารระหว่างผู้ใช้เรียกว่าการสนทนา และมีตัวแทนเป็น ออบเจ็กต์ MessagingStyle รายการ การสนทนาหรือ MessagingStyle มีชื่อ ข้อความและการสนทนาระหว่างผู้ใช้กลุ่มหนึ่งหรือไม่

เพื่อแจ้งให้ผู้ใช้ทราบเกี่ยวกับการอัปเดตการสนทนา เช่น ข้อความใหม่หรือการโพสต์แอป Notification ลงในระบบ Android Notification นี้ใช้ออบเจ็กต์ MessagingStyle เพื่อแสดงข้อความเฉพาะ UI ในหน้าต่างแจ้งเตือน แพลตฟอร์ม Android ยังส่งNotificationนี้ ไปยัง Android Auto และดึงข้อมูล MessagingStyle และใช้เพื่อโพสต์ ผ่านจอแสดงผลของรถยนต์

Android Auto ยังกำหนดให้แอปต้องเพิ่มออบเจ็กต์ Action รายการไปยัง Notification เพื่อ ให้ผู้ใช้ตอบกลับข้อความได้อย่างรวดเร็ว หรือทำเครื่องหมายว่าอ่านแล้วได้โดยตรงจาก หน้าต่างแจ้งเตือน

สรุป การสนทนารายการเดียวจะแสดงด้วย Notification ที่ถูกจัดรูปแบบด้วยออบเจ็กต์ MessagingStyle MessagingStyle มีข้อความทั้งหมดภายในการสนทนานั้น โดยอยู่ในอย่างน้อยหนึ่งข้อความ MessagingStyle.Message ออบเจ็กต์ และเพื่อให้เป็นไปตามข้อกำหนดของ Android Auto แอป ต้องแนบวัตถุ Action ตอบกลับและทำเครื่องหมายว่าอ่านแล้วกับ Notification

ขั้นตอนการรับส่งข้อความ

ส่วนนี้จะอธิบายการรับส่งข้อความทั่วไประหว่างแอปและ Android Auto

  1. แอปจะได้รับข้อความ
  2. แอปของคุณสร้างการแจ้งเตือนเกี่ยวกับMessagingStyleพร้อมการตอบกลับและ ทำเครื่องหมายว่าอ่านแล้ว Action ออบเจ็กต์
  3. Android Auto ได้รับเหตุการณ์ "การแจ้งเตือนใหม่" จากระบบ Android และค้นหา 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 หากต้องการเปิดการสนับสนุนนี้ โปรดระบุ รายการต่อไปนี้ในไฟล์ Manifest ของแอป

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

รายการไฟล์ Manifest นี้อ้างอิงไฟล์ XML อื่นที่คุณต้องสร้างด้วย เส้นทางต่อไปนี้: YourAppProject/app/src/main/res/xml/automotive_app_desc.xml ในautomotive_app_desc.xml ให้ประกาศความสามารถของ Android Auto ที่แอปของคุณ รองรับ เช่น หากต้องการประกาศการรองรับการแจ้งเตือน ให้ใส่ ดังต่อไปนี้:

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

หากตั้งค่าแอปเป็นเครื่องจัดการ SMS เริ่มต้นได้ ตรวจสอบว่าได้รวมเอลิเมนต์ <uses> ต่อไปนี้ไว้แล้ว หากไม่ใช้ ค่าเริ่มต้นจะเป็น ตัวแฮนเดิลในตัวของ Android Auto จะใช้ในการจัดการข้อความ SMS/MMS ขาเข้า เมื่อตั้งค่าแอปเป็นตัวแฮนเดิล SMS เริ่มต้น ซึ่งอาจทําให้เกิดเนื้อหาซ้ำ การแจ้งเตือน

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

นำเข้าไลบรารีหลักของ AndroidX

การสร้างการแจ้งเตือนเพื่อใช้กับอุปกรณ์ Auto จำเป็นต้องมี ไลบรารีหลักของ AndroidX นำเข้าคลังลงใน ดังนี้

  1. ในไฟล์ build.gradle ระดับบนสุด ให้ใส่ทรัพยากร Dependency ใน Maven ของ Google ดังที่ปรากฏในตัวอย่างต่อไปนี้

ดึงดูด

allprojects {
    repositories {
        google()
    }
}

Kotlin

allprojects {
    repositories {
        google()
    }
}
  1. ในไฟล์ build.gradle ของโมดูลแอป ให้ใส่ AndroidX Core ทรัพยากร Dependency ของไลบรารี ดังที่แสดงในตัวอย่างต่อไปนี้

ดึงดูด

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

Kotlin

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 สำหรับ Android Auto แอปของคุณมีออบเจ็กต์ Action อยู่ 2 ประเภท ต้องจัดการเรื่องการตอบและทำเครื่องหมายว่าอ่านแล้ว เราขอแนะนำให้จัดการปัญหาเหล่านี้โดยใช้ IntentService ซึ่ง ให้ความยืดหยุ่นในการจัดการ การเรียกในเบื้องหลัง ซึ่งทำให้เทรดหลักของแอปว่าง

กำหนดการดำเนินการของ Intent

การดำเนินการ Intent เป็นสตริงง่ายๆ ที่ระบุว่า Intent มีไว้เพื่ออะไร เนื่องจากบริการเดียวสามารถรองรับ Intent ได้หลายประเภท จึงง่ายกว่า กำหนดสตริงการทำงานหลายรายการแทนที่จะกำหนดหลายรายการ IntentService คอมโพเนนต์

ตัวอย่างแอปรับส่งข้อความของคู่มือนี้มีการดำเนินการที่จำเป็น 2 ประเภท ดังนี้ ตอบกลับและทำเครื่องหมายว่าอ่านแล้ว ดังที่แสดงในตัวอย่างโค้ดต่อไปนี้

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()
        }
    }
}

หากต้องการเชื่อมโยงบริการนี้กับแอป คุณจะต้องลงทะเบียนบริการด้วย ในไฟล์ Manifest ของแอปตามที่แสดงในตัวอย่างต่อไปนี้

<application>
    <service android:name="com.example.MessagingService" />
    ...
</application>

สร้างและจัดการความตั้งใจ

ไม่มีทางให้แอปอื่นๆ รวมถึง Android Auto ได้รับ Intent ที่ทริกเกอร์ MessagingService เนื่องจากระบบจะส่ง 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
}

ในคำสั่งสวิตช์ ACTION_REPLY ภายใน MessagingService แยกข้อมูลที่กรอกในการตอบ 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
}

ข้อกำหนดสวิตช์ ACTION_MARK_AS_READ ภายใน MessagingService ไม่จำเป็นต้องใช้ตรรกะเพิ่มเติม ดังที่แสดงในตัวอย่างต่อไปนี้

// Marking as read has no other logic.
ACTION_MARK_AS_READ -> conversation.markAsRead()

แจ้งผู้ใช้เกี่ยวกับข้อความ

เมื่อการจัดการการสนทนาเสร็จสมบูรณ์ ขั้นตอนถัดไปคือการ สร้างการแจ้งเตือนที่เป็นไปตามข้อกำหนดของ Android Auto

สร้างการกระทำ

สามารถส่งออบเจ็กต์ Action รายการไปยังแอปอื่นๆ โดยใช้ Notification เพื่อ เมธอดในแอปดั้งเดิม 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
  • 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 จึงมีข้อกำหนด 2 ประการสำหรับ 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 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
}

เมื่อสร้าง Intent ที่รอดำเนินการ ระบบจะใช้ 2 วิธีดังนี้ createReplyId() และ createMarkAsReadId() วิธีการเหล่านี้จะทำหน้าที่เป็น รหัสสำหรับ PendingIntent แต่ละรายการ ซึ่ง Android จะใช้เพื่อควบคุม Intent ที่รอดำเนินการอยู่แล้ว เมธอด create() ต้อง จะแสดงรหัสที่ไม่ซ้ำกันสำหรับการสนทนาแต่ละรายการ แต่การโทรซ้ำสำหรับการสนทนาเดียวกัน การสนทนาต้องแสดงรหัสที่ไม่ซ้ำกันที่สร้างไว้แล้ว

ลองพิจารณาตัวอย่างที่มีการสนทนา 2 รายการ A และ B: รหัสการตอบกลับของการสนทนา A คือ 100 และรหัสมาร์กเมื่ออ่านคือ 101 รหัสการตอบกลับของการสนทนา ข คือ 102 และรหัสมาร์ก-ว่าอ่านแล้วคือ 103 ถ้ามีการอัปเดตการสนทนา A รหัสการตอบกลับและทำเครื่องหมายเมื่ออ่านยังคงเป็น 100 และ 101 สำหรับข้อมูลเพิ่มเติม โปรดดู PendingIntent.FLAG_UPDATE_CURRENT

สร้าง MessagingStyle

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

หากคุณพบปัญหาขณะพัฒนาแอปรับส่งข้อความสำหรับ Android Auto คุณสามารถรายงานได้โดยใช้ เครื่องมือติดตามปัญหาของ Google ตรวจสอบว่าได้กรอกข้อมูลที่ขอทั้งหมดในเทมเพลตของปัญหา

สร้างรายการใหม่

ก่อนที่จะส่งปัญหาใหม่ ให้ตรวจสอบว่ามีการรายงานปัญหาดังกล่าวในปัญหาแล้วหรือยัง รายการ คุณสามารถสมัครรับข้อมูลและโหวตปัญหาโดยคลิกดาวของปัญหาใน แท็กติดตาม สำหรับข้อมูลเพิ่มเติม โปรดดู การสมัครรับปัญหา