Добавьте функции чата в приложение Android с помощью API-интерфейсов Messaging и People.

1. Прежде чем начать

Создать приложение для обмена сообщениями сложно. Хотя общий пользовательский опыт является субъективным, Android предоставляет API-интерфейсы Messaging и People, которые улучшают и оптимизируют работу в чате.

В этой лаборатории вы узнаете, как использовать эти API для создания привлекательной экосистемы для приложений чата на Android. Вы расширяете приложение JetChat , простое и нефункциональное приложение для чата, использующее Jetpack Compose.

Предварительные условия

Что ты построишь

Расширенное приложение JetChat, которое выполняет следующие действия:

  • Отображает уведомления, представляющие беседы, в зарезервированном разделе бесед на панели уведомлений.
  • Ссылки разделяют цели в этих уведомлениях, что позволяет вам делиться ими в разговорах вашего приложения.
  • Применяет передовые методы создания этих объектов, чтобы использовать возможности системы по умолчанию, которые улучшают ваше приложение.

Что вы узнаете

  • Как отображать уведомления, связанные с разговором, в зарезервированном разделе разговора на панели уведомлений.
  • Как понять различные возможности, предоставляемые API-интерфейсами обмена сообщениями и людьми.

Что вам понадобится

  • Гит
  • Android-студия
  • Учетная запись GitHub

2. Настройте

Отправная точка основана на приложении JetChat . Стартовый код расширяет приложение JetChat, чтобы лучше демонстрировать API-интерфейсы обмена сообщениями и людьми.

Получить стартовый код

Чтобы получить стартовый код для этой лаборатории кода, выполните следующие действия:

  1. В командной строке клонируйте следующий репозиторий GitHub:
git clone –branch starter-code \
https://github.com/android/people-messaging-codelab.git
  1. Откройте проект в Android Studio и нажмите a1bbb9d97659a043.png Запустите приложение . Появится панель «Эмулятор» , в которой отобразится приложение.

Изучите расширенное приложение JetChat

  1. В текстовом поле «Сообщение #composers» приложения введите сообщение и нажмите « Отправить» .
  2. Выйдите из приложения. Через несколько секунд вы получите push-уведомление с ответом от кого-то из чата.

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 , дополнительный контекст, соответствующий сообщению, например время его отправки и отправителя.

РазговорФрагмент.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. В текстовом поле «Сообщение #composers» приложения введите сообщение и нажмите « Отправить» .
  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 :

ярлыки.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 определите фильтр намерений, содержащий логику совместного использования:

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. На вкладке «Проект» щелкните app > java > com.example.compose.jetchat > conversation > util , а затем дважды щелкните ConversationUtil .
  2. В файле ConversationUtil.kt добавьте функцию generateShortcut :

РазговорUtil.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 , необходимые для диалога. Человек — это контакт, связанный с ярлыком, и установка для параметра long-lived true значения гарантирует, что этот ярлык будет кэшироваться системой и отображаться на различных поверхностях пользовательского интерфейса.

Ссылка на ярлык в уведомлении

Вам необходимо указать ярлык общего доступа в уведомлении. Однако вам необходимо создать ярлык, прежде чем отправлять уведомление.

Для этого выполните следующие действия:

  1. В файле ConversationFragment.kt найдите класс ConversationFragment .
  2. Перед вызовом переменной notification создайте переменную shortcut , которая ссылается на ярлык, созданный из ConversationUtil.generateShortcut .
  3. В методе createNotification переменной notification замените null на переменную shortcut в качестве параметра.

РазговорФрагмент.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 в качестве параметра.

РазговорФрагмент.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()
}

Опубликовать ярлык

  • Чтобы опубликовать ярлык, в функции simulateResponseAsANotification перед методом notificationManager.notify вызовите метод pushDynamicShortcut :

РазговорФрагмент.kt

import androidx.core.content.pm.ShortcutManagerCompat

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

Запустите приложение

  1. Запустите приложение.
  2. В текстовом поле «Сообщение #composers» приложения введите сообщение и нажмите « Отправить» .
  3. Выйдите из приложения. Вы снова получаете push-уведомление, но оно более четко оформлено как уведомление, связанное с разговором. Значок аватара более выражен и интегрирован со значком приложения. Отправитель, время и текст также стали более оптимизированными.

5. Необязательно: включите пузырьки.

Пузыри были представлены в Android 9, а затем улучшены и перепрофилированы для использования в контексте разговоров в Android 11. Пузыри представляют собой круговые наложения, которые являются аватарами ваших разговоров. Они появляются в панели запуска приложений и позволяют вам легко отвечать на разговоры в расширенной области. Даже если они реализованы, пузырьки не являются обязательными в зависимости от предпочтений пользователя.

Чтобы включить пузырьки, выполните следующие действия:

  1. В файл AndroidManifest.xml добавьте атрибутыallowEmbedded и allowEmbedded , а затем присвойте resizeableActivity true значение:

AndroidManifest.xml

<activity
  ...
  android:allowEmbedded="true"
  android:resizeableActivity="true"
  ...
</activity>
  1. В классе ConversationUtil файла ConversationUtil.kt добавьте метаданные пузырька:

РазговорUtil.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 создайте и укажите метаданные пузырька в уведомлении:

РазговорФрагмент.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. В текстовом поле «Сообщение #composers» приложения введите сообщение и нажмите « Отправить» .
  3. Выйдите из приложения. Через несколько секунд вы получите уведомление из чата в виде пузырька.
  4. Нажмите на пузырь. Разговор открывается из пузыря.

Пузырь разговора

6. Необязательно: поделитесь ссылкой.

Вы объявили цели общего доступа и ссылались на них в своих уведомлениях, что также позволило отобразить ваш контакт в Sharesheet — восходящем компоненте, который появляется при отправке намерения ACTION . Цели общего доступа отображаются в верхней части таблицы общего доступа и позволяют вам делиться богатым контентом в своих беседах.

Чтобы вызвать Sharesheet, выполните следующие действия:

  1. На своем устройстве откройте Google Chrome, а затем перейдите на выбранную вами веб-страницу, например, Developer.android.com .
  2. При необходимости нажмите 2fdbaccda71bc5f0.png Более верт .
  3. Нажмите 771b0be21764f6b6.png Делиться . Таблица общего доступа появится в нижней части экрана.

Таблица обмена

  1. Если возможно, нажмите 468248e6b8a84bb3.png ДжетЧат . URL-адрес доступен в чате.
  2. Если ты не видишь 468248e6b8a84bb3.png JetChat , нажмите 145399af71577431.png «Еще» , чтобы вызвать общую таблицу системы, а затем проведите пальцем вверх по ShareSheet и нажмите 468248e6b8a84bb3.png ДжетЧат . URL-адрес будет опубликован в чате.

Это простой пример. Есть более богатые типы контента, которыми можно поделиться. Дополнительную информацию см. в разделе Получение простых данных из других приложений .

7. Поздравления

Поздравляем! Теперь вы знаете, как добавить функции чата в приложение Android с помощью API-интерфейсов Messaging и People. Приятного обмена сообщениями!

Узнать больше