เพิ่มฟีเจอร์เกี่ยวกับแชทในแอป Android ด้วย Messaging และ People API

1. ก่อนเริ่มต้น

การสร้างแอปรับส่งข้อความเป็นเรื่องที่ท้าทาย แม้ว่าประสบการณ์โดยรวมของผู้ใช้จะเป็นเรื่องส่วนบุคคล แต่ Android ก็มี Messaging API และ People API ซึ่งช่วยปรับปรุงและเพิ่มประสิทธิภาพประสบการณ์การแชท

ใน Codelab นี้ คุณจะได้เรียนรู้วิธีใช้ API เหล่านี้เพื่อสร้างระบบนิเวศที่น่าสนใจสำหรับแอปแชทใน Android คุณจะขยายแอป JetChat ซึ่งเป็นแอปแชทแบบพื้นฐานที่ไม่มีฟังก์ชันการทำงานและใช้ Jetpack Compose

ข้อกำหนดเบื้องต้น

  • มีความรู้พื้นฐานเกี่ยวกับการพัฒนาแอป Android
  • ความรู้พื้นฐานเกี่ยวกับการแจ้งเตือน

สิ่งที่คุณจะสร้าง

แอป JetChat แบบขยายซึ่งทำสิ่งต่อไปนี้

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

สิ่งที่คุณจะได้เรียนรู้

  • วิธีแสดงการแจ้งเตือนที่เกี่ยวข้องกับการสนทนาในส่วนการสนทนาที่สงวนไว้ของลิ้นชักการแจ้งเตือน
  • วิธีทำความเข้าใจประสบการณ์ต่างๆ ที่ API การรับส่งข้อความและ API ผู้ใช้เปิดใช้

สิ่งที่คุณต้องมี

  • Git
  • Android Studio
  • บัญชี GitHub

2. ตั้งค่า

จุดเริ่มต้นจะอิงตามแอป JetChat โค้ดเริ่มต้นจะขยายแอป JetChat เพื่อแสดง Messaging API และ People API ได้ดียิ่งขึ้น

รับโค้ดเริ่มต้น

หากต้องการรับโค้ดเริ่มต้นสำหรับ Codelab นี้ ให้ทำตามขั้นตอนต่อไปนี้

  1. จากบรรทัดคำสั่ง ให้โคลนที่เก็บ GitHub ต่อไปนี้
git clone –branch starter-code \
https://github.com/android/people-messaging-codelab.git
  1. เปิดโปรเจ็กต์ใน Android Studio แล้วคลิก a1bbb9d97659a043.png Run app แผง Emulator จะปรากฏขึ้นและแสดงแอป

สำรวจแอป JetChat เวอร์ชันขยาย

  1. ในกล่องข้อความผู้แต่งข้อความของแอป ให้ป้อนข้อความแล้วแตะส่ง
  2. ออกจากแอป หลังจากผ่านไปสักครู่ คุณจะได้รับการแจ้งเตือนแบบพุชที่มีคำตอบจากบุคคลในแชท

3. สร้างการแจ้งเตือนการสนทนา

Android 11 เปิดตัว API ที่อนุญาตให้การแจ้งเตือนที่เกี่ยวข้องกับการแชทปรากฏในส่วนที่กำหนดในลิ้นชักการแจ้งเตือน ซึ่งมีไว้สำหรับการสนทนาโดยเฉพาะ

ลิ้นชักการแจ้งเตือนที่ปรากฏขึ้นเมื่อปัดลงจากแถบสถานะ

การแจ้งเตือนต้องอยู่ในคลาส Notification.MessagingStyle และอ้างอิงทางลัดการแชร์ ที่แสดงอยู่ตลอด ในส่วนนี้ คุณจะได้เรียนรู้วิธีปฏิบัติตามข้อกำหนดของ API เหล่านี้เพื่อแสดงการแจ้งเตือนที่แสดงถึงการสนทนาในส่วนการสนทนา

หากต้องการเปิดใช้การแจ้งเตือนสำหรับชั้นเรียน NotificationCompat.MessagingStyle ให้ทำตามขั้นตอนต่อไปนี้

  1. ในแท็บโปรเจ็กต์ของ Android Studio ให้คลิก app > java > com.example.compose.jetchat > conversation จากนั้นดับเบิลคลิก ConversationFragment
  2. ในไฟล์ ConversationFragment.kt ให้ค้นหาคลาส ConversationFragment แล้วค้นหาบล็อกโค้ด Notification ของฟังก์ชัน createNotification ที่สร้างการแจ้งเตือน
  3. แทนที่เมธอด setContentText ด้วยเมธอด setStyle ที่ตั้งค่ารูปแบบของการแจ้งเตือนเป็นคลาส NotificationCompat.MessagingStyle คลาสตัวช่วยนี้จะเพิ่มข้อความที่ตั้งค่าด้วยเมธอด setContextText พร้อมบริบทเพิ่มเติมที่เกี่ยวข้องกับข้อความ เช่น เวลาที่ส่งและผู้ที่ส่ง

ConversationFragment.kt

private fun createNotification(
   notificationId: Int,
   message: Message,
   person: Person,
   shortcut: ShortcutInfoCompat,
   time: Long
): Notification? {
    ...
    .setStyle(NotificationCompat.MessagingStyle(person).addMessage(
                      NotificationCompat.MessagingStyle.Message(
                          message.content,
                          time,
                          person
                      )
    )
    )
    ...
    .build()
}

เรียกใช้แอป

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

4. สร้างเป้าหมายการแชร์สำหรับการสนทนา

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

กำหนดเป้าหมายส่วนแบ่ง

  1. ในแท็บโปรเจ็กต์ ให้คลิกขวาที่ไดเรกทอรี res แล้วเลือกใหม่ > ไดเรกทอรี
  2. ป้อน xml ในกล่องข้อความ แล้วกด Enter (หรือ return ใน macOS)
  3. คลิกขวาที่ไดเรกทอรี xml แล้วเลือกไฟล์
  4. ป้อน shortcuts.xml ในกล่องข้อความ แล้วกด Enter (หรือ return ใน macOS)
  5. ในไฟล์ shortcuts.xml ให้ประกาศเป้าหมายการแชร์ ที่จัดการการแชร์ข้อมูลประเภท text/plain ดังนี้

shortcuts.xml

<shortcuts xmlns:android="http://schemas.android.com/apk/res/android">
  <share-target android:targetClass="com.example.compose.jetchat.NavActivity">
   <data android:mimeType="text/plain" />
   <category android:name="com.example.compose.jetchat.share.TEXT_SHARE_TARGET" />
 </share-target>
</shortcuts>
  1. ในแท็บโปรเจ็กต์ ให้คลิก manifests แล้วดับเบิลคลิก AndroidManifest.xml
  2. ในไฟล์ AndroidManifest.xml ให้กำหนดไฟล์ shortcuts.xml ดังนี้

AndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.compose.jetchat">

   <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/Theme.Jetchat.NoActionBar">
...
 <meta-data android:name="android.app.shortcuts"
            android:resource="@xml/shortcuts" />

    </application>
</manifest>
  1. ในคอมโพเนนต์ activity ของไฟล์ AndroidManifest.xml ให้กำหนดตัวกรอง Intent ที่มีตรรกะการแชร์

AndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   package="com.example.compose.jetchat">

   ...
       <activity
           ...
           <intent-filter>
               <action android:name="android.intent.action.SEND" />
               <category android:name="android.intent.category.DEFAULT" />
               <data android:mimeType="text/plain" />
           </intent-filter>
...

กำหนดทางลัด

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

หากต้องการสร้างทางลัด ให้ทำตามขั้นตอนต่อไปนี้

  1. ในแท็บโปรเจ็กต์ ให้คลิก app > java > com.example.compose.jetchat > conversation > util จากนั้นดับเบิลคลิก ConversationUtil
  2. เพิ่มฟังก์ชัน generateShortcut ในไฟล์ ConversationUtil.kt

ConversationUtil.kt

import android.content.Intent
import androidx.core.content.pm.ShortcutInfoCompat
import com.example.compose.jetchat.NavActivity

class ConversationUtil {

   companion object {
...
fun generateShortcut(context: Context, shortcutId: String): ShortcutInfoCompat {
   return ShortcutInfoCompat.Builder(context, shortcutId)
   .setCategories(setOf(CATEGORY_SHARE))
   .setLongLived(true)
   .setShortLabel(shortcutId)
   .setLongLabel(shortcutId)
   .setIntent(
       Intent(context, NavActivity::class.java)
           .setAction(Intent.ACTION_VIEW)
   )
   .build()
}

ฟังก์ชันนี้มีเมธอด setPerson และ setLongLived ที่จำเป็นสำหรับการสนทนา บุคคลดังกล่าวคือผู้ติดต่อที่เชื่อมโยงกับทางลัด และการตั้งค่าระยะยาวเป็นค่า true จะช่วยให้มั่นใจได้ว่าระบบจะแคชทางลัดนี้และแสดงในแพลตฟอร์มต่างๆ ใน UI

อ้างอิงทางลัดในการแจ้งเตือน

คุณต้องอ้างอิงทางลัดการแชร์ในการแจ้งเตือน อย่างไรก็ตาม คุณต้องสร้างทางลัดก่อนที่จะพุชการแจ้งเตือน

โดยทำตามขั้นตอนต่อไปนี้

  1. ในไฟล์ ConversationFragment.kt ให้ค้นหาคลาส ConversationFragment
  2. ก่อนที่จะเรียกใช้ตัวแปร notification ให้สร้างตัวแปร shortcut ที่อ้างอิงถึงทางลัดที่สร้างจาก ConversationUtil.generateShortcut
  3. ในเมธอด createNotification ของตัวแปร notification ให้แทนที่ null ด้วยตัวแปร shortcut เป็นพารามิเตอร์

ConversationFragment.kt

private fun simulateResponseAsANotification() {
   ...
   if (message.author != "me") {
       ...
       val shortcut = ConversationUtil.generateShortcut(context!!, message.author)
       val notification = createNotification(notificationId, message, person, shortcut, time)
       ...
   }
}
  1. ในcreateNotification ให้เพิ่มเมธอด NotificationCompat.Builder#setShortcutInfo แล้วส่งตัวแปร shortcut เป็นพารามิเตอร์

ConversationFragment.kt

private fun createNotification(
  notificatoinIf: Int,
  messagin: Message,
  person: Person,
  shortcut: ShortcutInfoCompat?,
  time: Long
): Notification {
...
return NotificationCompat.Builder(context!!,  ConversationUtil.CHANNEL_MESSAGES)
   ...
   .setShortcutInfo(shortcut)
   .build()
}

เผยแพร่ทางลัด

  • หากต้องการเผยแพร่ทางลัด ให้เรียกใช้เมธอด pushDynamicShortcut ในฟังก์ชัน simulateResponseAsANotification ก่อนเมธอด notificationManager.notify

ConversationFragment.kt

import androidx.core.content.pm.ShortcutManagerCompat

...private fun simulateResponseAsANotification() {
   ...
   if (message.author != "me") {
       ...
       ShortcutManagerCompat.pushDynamicShortcut(context!!, shortcut)
       ...
   }
}

เรียกใช้แอป

  1. เรียกใช้แอป
  2. ในกล่องข้อความผู้แต่งข้อความของแอป ให้ป้อนข้อความแล้วแตะส่ง
  3. ออกจากแอป คุณจะได้รับการแจ้งเตือนแบบพุชอีกครั้ง แต่การแจ้งเตือนนี้จะมีรูปแบบที่ชัดเจนมากขึ้นในฐานะการแจ้งเตือนที่เกี่ยวข้องกับการสนทนา ไอคอนอวาตาร์จะโดดเด่นมากขึ้นและผสานรวมกับไอคอนแอป นอกจากนี้ ผู้ส่ง เวลา และข้อความยังได้รับการปรับปรุงให้มีประสิทธิภาพมากขึ้นด้วย

5. ไม่บังคับ: เปิดใช้บับเบิล

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

หากต้องการเปิดใช้บับเบิล ให้ทำตามขั้นตอนต่อไปนี้

  1. ในไฟล์ AndroidManifest.xml ให้เพิ่มแอตทริบิวต์ allowEmbedded และ resizeableActivity จากนั้นตั้งค่าแต่ละแอตทริบิวต์เป็นค่า true ดังนี้

AndroidManifest.xml

<activity
  ...
  android:allowEmbedded="true"
  android:resizeableActivity="true"
  ...
</activity>
  1. ในคลาส ConversationUtil.kt ของไฟล์ ConversationUtil ให้เพิ่มข้อมูลเมตาของบับเบิล

ConversationUtil.kt

import androidx.core.app.NotificationCompat
import androidx.core.graphics.drawable.IconCompat


fun createBubbleMetadata(context: Context, icon: IconCompat): NotificationCompat.BubbleMetadata {
        // Create bubble intent
        val target = Intent(context, NavActivity::class.java)
        val bubbleIntent = PendingIntent.getActivity(context, REQUEST_BUBBLE, target, flagUpdateCurrent(mutable = true))

        // Create bubble metadata
        return NotificationCompat.BubbleMetadata.Builder(bubbleIntent, icon)
            .setDesiredHeight(400)
            .setSuppressNotification(true)
            .build()
    }
  1. ในไฟล์ ConversationFragment.kt ให้สร้างและอ้างอิงข้อมูลเมตาของบับเบิลในการแจ้งเตือน

ConversationFragment.kt

private fun createNotification(
  notificatoinIf: Int,
  messagin: Message,
  person: Person,
  shortcut: ShortcutInfoCompat?,
  time: Long
): Notification {
...
// Reference the bubble metadata in the notification.
  return NotificationCompat.Builder(context!!,     ConversationUtil.CHANNEL_MESSAGES)
    ...
     .setBubbleMetadata(ConversationUtil.createBubbleMetadata(context!!, person.icon!!))
...
    .build()
}

เรียกใช้แอป

  1. เรียกใช้แอป
  2. ในกล่องข้อความผู้แต่งข้อความของแอป ให้ป้อนข้อความแล้วแตะส่ง
  3. ออกจากแอป หลังจากผ่านไป 2-3 วินาที คุณจะได้รับการแจ้งเตือนจากแชทในรูปแบบของบับเบิล
  4. แตะบับเบิล การสนทนาจะเปิดขึ้นจากบับเบิล

บับเบิลการสนทนา

6. ไม่บังคับ: แชร์ลิงก์

คุณประกาศเป้าหมายการแชร์และอ้างอิงเป้าหมายเหล่านั้นในการแจ้งเตือน ซึ่งยังช่วยให้รายชื่อติดต่อของคุณปรากฏในชีตการแชร์ด้วย ซึ่งเป็นคอมโพเนนต์จากล่างขึ้นบนที่จะปรากฏเมื่อมีการส่งACTION Intent เป้าหมายการแชร์จะปรากฏที่ด้านบนของ Sharesheet และช่วยให้คุณแชร์เนื้อหาที่สมบูรณ์ในการสนทนาได้

หากต้องการเรียกใช้ชีตการแชร์ ให้ทำตามขั้นตอนต่อไปนี้

  1. เปิด Google Chrome ในอุปกรณ์ แล้วไปที่หน้าเว็บที่คุณต้องการ เช่น developer.android.com
  2. หากจำเป็น ให้คลิก 2fdbaccda71bc5f0.png More vert
  3. คลิก 771b0be21764f6b6.png แชร์ แชร์ชีตจะปรากฏที่ด้านล่างของหน้าจอ

แผ่นแชร์

  1. หากเป็นไปได้ ให้คลิก 468248e6b8a84bb3.png JetChat เมื่อมีการแชร์ URL ในแชท
  2. หากไม่เห็น 468248e6b8a84bb3.png JetChat ให้คลิก 145399af71577431.png เพิ่มเติมเพื่อเรียกใช้แชร์ชีตของระบบ จากนั้นปัดขึ้นในแชร์ชีตแล้วคลิก 468248e6b8a84bb3.png JetChat เมื่อมีการแชร์ URL ในแชท

นี่เป็นตัวอย่างง่ายๆ มีเนื้อหาประเภทต่างๆ ที่แชร์ได้มากขึ้น ดูข้อมูลเพิ่มเติมได้ที่การดึงข้อมูลอย่างง่ายจากแอปอื่นๆ

7. ขอแสดงความยินดี

ยินดีด้วย ตอนนี้คุณก็ได้ทราบวิธีเพิ่มฟีเจอร์ที่เกี่ยวข้องกับการแชทลงในแอป Android ด้วย Messaging API และ People API แล้ว ขอให้สนุกกับการรับส่งข้อความ

ดูข้อมูลเพิ่มเติม