Thêm các tính năng liên quan đến trò chuyện vào ứng dụng Android bằng API Nhắn tin và API Mọi người

1. Trước khi bắt đầu

Không dễ để tạo một ứng dụng nhắn tin. Mặc dù trải nghiệm người dùng tổng thể mang tính chủ quan, nhưng Android cung cấp các API Nhắn tin và Mọi người, giúp cải thiện và đơn giản hoá trải nghiệm trò chuyện.

Trong lớp học lập trình này, bạn tìm hiểu cách sử dụng các API này để tạo ra một hệ sinh thái hấp dẫn cho các ứng dụng trò chuyện trên Android. Bạn mở rộng ứng dụng JetChat, một ứng dụng trò chuyện đơn giản và không hoạt động và sử dụng Jetpack Compose.

Điều kiện tiên quyết

  • Kiến thức cơ bản về phát triển Android
  • Kiến thức cơ bản về thông báo

Sản phẩm bạn sẽ tạo ra

Một ứng dụng JetChat mở rộng thực hiện những việc sau:

  • Hiện thông báo đại diện cho cuộc trò chuyện trong phần cuộc trò chuyện dành riêng của ngăn thông báo.
  • Tệp đối chiếu chia sẻ mục tiêu trong các thông báo này để bạn có thể chia sẻ trong các cuộc trò chuyện của ứng dụng.
  • Thực thi các phương pháp hay nhất khi tạo các đối tượng này để tận dụng các trải nghiệm mặc định do hệ thống cung cấp nhằm cải thiện ứng dụng của bạn.

Kiến thức bạn sẽ học được

  • Cách hiển thị thông báo liên quan đến cuộc trò chuyện trong phần cuộc trò chuyện đã đặt trước của ngăn thông báo.
  • Cách tìm hiểu các trải nghiệm khác nhau do API Nhắn tin và API Người dùng mang lại.

Bạn cần có

  • Git
  • Android Studio
  • Tài khoản GitHub

2. Bắt đầu thiết lập

Điểm bắt đầu dựa trên ứng dụng JetChat. Mã khởi đầu mở rộng ứng dụng JetChat để làm nổi bật hơn các API Nhắn tin và Mọi người.

Tải mã nguồn ban đầu

Để lấy mã khởi đầu cho lớp học lập trình này, hãy làm theo các bước sau:

  1. Từ dòng lệnh, hãy sao chép kho lưu trữ GitHub sau:
git clone –branch starter-code \
https://github.com/android/people-messaging-codelab.git
  1. Mở dự án trong Android Studio rồi nhấp vào a1bbb9d97659a043.png Chạy ứng dụng. Ngăn Emulator (Trình mô phỏng) sẽ xuất hiện và cho thấy ứng dụng.

Khám phá ứng dụng JetChat mở rộng

  1. Trong hộp văn bản Message #composers của ứng dụng, hãy nhập tin nhắn rồi nhấn vào Gửi.
  2. Điều hướng khỏi ứng dụng. Sau vài giây, bạn nhận được thông báo đẩy có nội dung phản hồi của người nào đó trong cuộc trò chuyện.

3. Tạo thông báo về cuộc trò chuyện

Android 11 đã giới thiệu các API cho phép các thông báo liên quan đến trò chuyện xuất hiện trong một phần được chỉ định trong ngăn thông báo, dành riêng cho các cuộc trò chuyện.

Ngăn thông báo xuất hiện khi vuốt xuống từ thanh trạng thái

Thông báo phải thuộc lớp Notification.MessagingStyle và tham chiếu đến một lối tắt chia sẻ dài . Trong phần này, bạn tìm hiểu cách đáp ứng các yêu cầu về API này để hiển thị những thông báo đại diện cho cuộc trò chuyện trong phần trò chuyện.

Để tạo thông báo về lớp NotificationCompat.MessagingStyle, hãy làm theo các bước sau:

  1. Trong thẻ Project (Dự án) của Android Studio, hãy nhấp vào biểu tượng app > java > com.example.compose.jetchat > conversation rồi nhấp đúp vào ConversationFragment.
  2. Trong tệp ConversationFragment.kt, hãy tìm lớp ConversationFragment, sau đó tìm khối mã Notification của hàm createNotification nơi thông báo được tạo.
  3. Thay thế phương thức setContentText bằng phương thức setStyle để đặt kiểu của thông báo thành lớp NotificationCompat.MessagingStyle. Lớp trợ giúp này sẽ thêm thông báo đã đặt bằng phương thức setContextText kèm bối cảnh bổ sung liên quan đến thông báo, chẳng hạn như thời gian gửi và người gửi thông báo.

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

Chạy ứng dụng

  1. Chạy ứng dụng.
  2. Trong hộp văn bản Message #composers của ứng dụng, hãy nhập tin nhắn rồi nhấn vào Gửi.
  3. Điều hướng khỏi ứng dụng. Bạn lại nhận được thông báo đẩy nhưng thông báo đó có kiểu khác. Thông điệp này có hình đại diện và kiểu riêng biệt. Tuy nhiên, vẫn còn một số việc phải làm trước khi thông báo của bạn xuất hiện ở đúng nơi.

4. Tạo mục tiêu chia sẻ cho các cuộc trò chuyện

Bạn cần tham chiếu đến lối tắt chia sẻ hoặc đích đến được chia sẻ trong thông báo. Đích chia sẻ được xác định trong tệp shortcuts.xml và là điểm truy cập để xử lý lối tắt được xác định bằng phương thức lập trình. Các lối tắt mà bạn tạo đại diện cho các cuộc trò chuyện trong ứng dụng và cho phép bạn chia sẻ nội dung trong các cuộc trò chuyện của mình.

Xác định mục tiêu chia sẻ

  1. Trong thẻ Project (Dự án), hãy nhấp chuột phải vào thư mục res rồi chọn New (Mới) > Thư mục.
  2. Trong hộp văn bản, hãy nhập xml rồi nhấn Enter (hoặc return trên macOS).
  3. Nhấp chuột phải vào thư mục xml rồi chọn File (Tệp).
  4. Trong hộp văn bản, hãy nhập shortcuts.xml rồi nhấn Enter (hoặc return trên macOS).
  5. Trong tệp shortcuts.xml, hãy khai báo mục tiêu chia sẻ giúp xử lý việc chia sẻ dữ liệu thuộc loại 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. Trong thẻ Project (Dự án), hãy nhấp vào biểu tượng manifests rồi nhấp đúp vào biểu tượng AndroidManifest.xml.
  2. Trong tệp AndroidManifest.xml, hãy xác định tệp 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. Trong thành phần activity của tệp AndroidManifest.xml, hãy xác định bộ lọc ý định chứa logic chia sẻ:

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>
...

Xác định lối tắt

Đối với mỗi thông báo, bạn cần liên kết lối tắt có liên quan. Bạn chỉ xác định một lối tắt duy nhất cho mỗi cuộc trò chuyện vì lối tắt duy nhất đại diện cho một người liên hệ mà bạn muốn chia sẻ.

Để tạo lối tắt, hãy làm theo các bước sau:

  1. Trong thẻ Project (Dự án), hãy nhấp vào app > java > com.example.compose.jetchat > conversation > util rồi nhấp đúp vào ConversationUtil.
  2. Trong tệp ConversationUtil.kt, hãy thêm một hàm generateShortcut:

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

Hàm này chứa các phương thức setPersonsetLongLived cần thiết cho cuộc trò chuyện. Người đó là người liên hệ liên kết với lối tắt và việc đặt tồn tại lâu dài thành giá trị true sẽ đảm bảo rằng lối tắt này được hệ thống lưu vào bộ nhớ đệm và xuất hiện ở nhiều nơi trên giao diện người dùng.

Tham chiếu đến lối tắt trong thông báo

Bạn cần tham chiếu lối tắt chia sẻ trong thông báo. Tuy nhiên, bạn phải tạo lối tắt trước khi đẩy thông báo.

Để thực hiện việc này, hãy làm theo các bước sau:

  1. Trong tệp ConversationFragment.kt, hãy tìm lớp ConversationFragment.
  2. Trước khi gọi biến notification, hãy tạo một biến shortcut tham chiếu đến lối tắt được tạo từ ConversationUtil.generateShortcut.
  3. Trong phương thức createNotification của biến notification, hãy thay thế null bằng biến shortcut làm tham số.

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. Trong phương thức createNotification, hãy thêm phương thức NotificationCompat.Builder#setShortcutInfo, sau đó truyền biến shortcut dưới dạng thông số.

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

Xuất bản lối tắt

  • Để xuất bản lối tắt, trong hàm simulateResponseAsANotification trước phương thức notificationManager.notify, hãy gọi phương thức pushDynamicShortcut:

ConversationFragment.kt

import androidx.core.content.pm.ShortcutManagerCompat

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

Chạy ứng dụng

  1. Chạy ứng dụng.
  2. Trong hộp văn bản Message #composers của ứng dụng, hãy nhập tin nhắn rồi nhấn vào Gửi.
  3. Điều hướng khỏi ứng dụng. Bạn nhận được thông báo đẩy một lần nữa nhưng thông báo đó được tạo kiểu rõ ràng hơn như một thông báo liên quan đến cuộc trò chuyện. Biểu tượng hình đại diện rõ ràng hơn và có cả biểu tượng ứng dụng. Người gửi, thời gian và văn bản cũng được sắp xếp hợp lý hơn.

5. Không bắt buộc: Bật bong bóng

Bong bóng trò chuyện được giới thiệu trong Android 9, đồng thời được cải tiến và sử dụng lại để sử dụng trong bối cảnh trò chuyện trong Android 11. Bong bóng trò chuyện là lớp phủ hình tròn là hình đại diện cho cuộc trò chuyện của bạn. Chúng xuất hiện trong trình chạy ứng dụng và cho phép bạn dễ dàng trả lời các cuộc trò chuyện trong bong bóng mở rộng. Ngay cả khi được triển khai, bong bóng trò chuyện vẫn là không bắt buộc tuỳ thuộc vào lựa chọn ưu tiên của người dùng.

Để bật bong bóng, hãy làm theo các bước sau:

  1. Trong tệp AndroidManifest.xml, hãy thêm các thuộc tính allowEmbeddedresizeableActivity, sau đó đặt mỗi thuộc tính thành một giá trị true:

AndroidManifest.xml

<activity
  ...
  android:allowEmbedded="true"
  android:resizeableActivity="true"
  ...
</activity>
  1. Trong lớp ConversationUtil của tệp ConversationUtil.kt, hãy thêm siêu dữ liệu bong bóng:

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. Trong tệp ConversationFragment.kt, hãy tạo và tham chiếu đến siêu dữ liệu bong bóng trên thông báo:

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

Chạy ứng dụng

  1. Chạy ứng dụng.
  2. Trong hộp văn bản Message #composers của ứng dụng, hãy nhập tin nhắn rồi nhấn vào Gửi.
  3. Điều hướng khỏi ứng dụng. Sau vài giây, bạn sẽ nhận được thông báo từ cuộc trò chuyện dưới dạng bong bóng.
  4. Nhấn vào bong bóng. Cuộc trò chuyện sẽ mở từ bong bóng.

Bong bóng trò chuyện

6. Không bắt buộc: Chia sẻ đường liên kết

Bạn đã khai báo các mục tiêu chia sẻ và tham chiếu các mục tiêu này trong thông báo của mình. Việc này cũng cho phép hiển thị người liên hệ của bạn trong Trang chia sẻ nội dung. Đây là thành phần từ dưới lên xuất hiện khi ý định ACTION được gửi. Mục tiêu chia sẻ xuất hiện ở đầu Trang chia sẻ nội dung và cho phép bạn chia sẻ nội dung đa dạng thức trong cuộc trò chuyện.

Để gọi Trang chia sẻ nội dung, hãy làm theo các bước sau:

  1. Trên thiết bị, hãy mở Google Chrome rồi chuyển đến một trang web mà bạn chọn, chẳng hạn như developer.android.com.
  2. Nếu cần, nhấp vào 2fdbaccda71bc5f0.pngS Nhiều đỉnh.
  3. Nhấp vào 771b0be21764f6b6.pngS Chia sẻ. Trang chia sẻ nội dung sẽ xuất hiện ở cuối màn hình.

Trang chia sẻ nội dung

  1. Nếu có thể, hãy nhấp vào 468248e6b8a84bb3.pngS JetChat. URL được chia sẻ trong cuộc trò chuyện.
  2. Nếu bạn không thấy 468248e6b8a84bb3.pngS JetChat, hãy nhấp vào 145399af71577431.pngS Thêm để gọi trang chia sẻ nội dung của hệ thống, sau đó vuốt lên trên Trang chia sẻ nội dung và nhấp vào 468248e6b8a84bb3.pngS JetChat. URL được chia sẻ trong cuộc trò chuyện.

Đây là một ví dụ đơn giản. Có nhiều loại nội dung phong phú hơn để chia sẻ. Để biết thêm thông tin, hãy xem phần Truy xuất dữ liệu đơn giản từ các ứng dụng khác.

7. Xin chúc mừng

Xin chúc mừng! Giờ đây, bạn đã biết cách thêm các tính năng liên quan đến trò chuyện vào ứng dụng Android bằng API Nhắn tin và Mọi người. Chúc bạn nhắn tin vui vẻ!

Tìm hiểu thêm