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

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

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

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

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

  • Базовые знания разработки под Android.
  • Базовые знания об уведомлениях

Что вы построите

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

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

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

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

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

  • Гит
  • Android Studio
  • Аккаунт на 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. В текстовом поле «Сообщения #композиторы» приложения введите сообщение и нажмите «Отправить» .
  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 , с дополнительным контекстом, относящимся к сообщению, таким как время отправки и отправитель.

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

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 :

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

Укажите ярлык в уведомлении.

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

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

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

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

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

ConversationFragment.kt

import androidx.core.content.pm.ShortcutManagerCompat

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

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

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

5. Дополнительно: Включить всплывающие окна.

Функция «пузырьков» (Bubbles) была представлена ​​в Android 9, а в Android 11 была улучшена и переработана для использования в контексте диалогов. «Пузырьки» — это круглые наложения, которые служат аватарами для ваших разговоров. Они появляются в панели запуска приложений и позволяют легко отвечать на сообщения в развернутом окне. Даже при наличии такой функции, «пузырьки» остаются необязательными и зависят от предпочтений пользователя.

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

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

AndroidManifest.xml

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

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. Выйдите из приложения. Через несколько секунд вы получите уведомление из чата в виде всплывающего окна.
  4. Нажмите на всплывающее окно. Диалог начнётся из всплывающего окна.

Облачный диалог

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

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

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

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

Таблица акций

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

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

7. Поздравляем!

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

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