1. Прежде чем начать
Создать приложение для обмена сообщениями сложно. Хотя общий пользовательский опыт является субъективным, Android предоставляет API-интерфейсы Messaging и People, которые улучшают и оптимизируют работу в чате.
В этой лаборатории вы узнаете, как использовать эти API для создания привлекательной экосистемы для приложений чата на Android. Вы расширяете приложение JetChat , простое и нефункциональное приложение для чата, использующее Jetpack Compose.
Предварительные условия
- Базовые знания Android-разработки.
- Базовые знания уведомлений
Что ты построишь
Расширенное приложение JetChat, которое выполняет следующие действия:
- Отображает уведомления, представляющие беседы, в зарезервированном разделе бесед на панели уведомлений.
- Ссылки разделяют цели в этих уведомлениях, что позволяет вам делиться ими в разговорах вашего приложения.
- Применяет передовые методы создания этих объектов, чтобы использовать возможности системы по умолчанию, которые улучшают ваше приложение.
Что вы узнаете
- Как отображать уведомления, связанные с разговором, в зарезервированном разделе разговора на панели уведомлений.
- Как понять различные возможности, предоставляемые API-интерфейсами обмена сообщениями и людьми.
Что вам понадобится
- Гит
- Android-студия
- Учетная запись GitHub
2. Настройте
Отправная точка основана на приложении JetChat . Стартовый код расширяет приложение JetChat, чтобы лучше демонстрировать API-интерфейсы обмена сообщениями и людьми.
Получить стартовый код
Чтобы получить стартовый код для этой лаборатории кода, выполните следующие действия:
- В командной строке клонируйте следующий репозиторий GitHub:
git clone –branch starter-code \ https://github.com/android/people-messaging-codelab.git
- Откройте проект в Android Studio и нажмите Запустите приложение . Появится панель «Эмулятор» , в которой отобразится приложение.
Изучите расширенное приложение JetChat
- В текстовом поле «Сообщение #composers» приложения введите сообщение и нажмите « Отправить» .
- Выйдите из приложения. Через несколько секунд вы получите push-уведомление с ответом от кого-то из чата.
3. Создавайте уведомления о разговорах
В Android 11 появились API , которые позволяют уведомлениям, связанным с чатом, появляться в специально отведенном разделе панели уведомлений, предназначенном исключительно для разговоров.
Уведомление должно относиться к классу Notification.MessagingStyle
и ссылаться на долговременный ярлык общего доступа . В этом разделе вы узнаете, как выполнить эти требования API для отображения уведомлений, представляющих беседы в разделе бесед.
Чтобы отправлять уведомления класса NotificationCompat.MessagingStyle
, выполните следующие действия:
- На вкладке «Проект » Android Studio щелкните
app
>java
>com.example.compose.jetchat
>conversation
, а затем дважды щелкнитеConversationFragment
. - В файле
ConversationFragment.kt
найдите классConversationFragment
, а затем найдите блок кодаNotification
функцииcreateNotification
, в котором создается уведомление. - Замените метод
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()
}
Запустите приложение
- Запустите приложение.
- В текстовом поле «Сообщение #composers» приложения введите сообщение и нажмите « Отправить» .
- Выйдите из приложения. Вы снова получаете push-уведомление, но в другом стиле. Он включает в себя аватар и особый стиль сообщения. Однако предстоит еще многое сделать, прежде чем ваши уведомления появятся там, где они должны.
4. Создайте цели обмена для разговоров
В уведомлении вам необходимо указать ярлык общего доступа или цель общего доступа . Целевые объекты общего доступа определяются в файле shortcuts.xml
и являются точками входа для обработки ярлыков, определенных программно. Создаваемые вами ярлыки представляют собой разговоры в приложении и позволяют вам делиться контентом в своих разговорах.
Определите цели общего доступа
- На вкладке «Проект» щелкните правой кнопкой мыши каталог
res
и выберите «Создать» > «Каталог» . - В текстовом поле введите
xml
и нажмитеEnter
(илиreturn
в macOS). - Щелкните правой кнопкой мыши каталог
xml
и выберите «Файл» . - В текстовом поле введите
shortcuts.xml
и нажмитеEnter
(илиreturn
в macOS). - В файле
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>
- На вкладке «Проект» щелкните
manifests
, а затем дважды щелкнитеAndroidManifest.xml
. - В файле
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>
- В компоненте
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>
...
Определение ярлыков
Для каждого уведомления вам необходимо связать соответствующий ярлык. Вы определяете только один уникальный ярлык для каждого разговора, поскольку уникальный ярлык представляет собой один контакт, с которым можно поделиться.
Чтобы создать ярлык, выполните следующие действия:
- На вкладке «Проект» щелкните
app
>java
>com.example.compose.jetchat
>conversation
>util
, а затем дважды щелкнитеConversationUtil
. - В файле
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
значения гарантирует, что этот ярлык будет кэшироваться системой и отображаться на различных поверхностях пользовательского интерфейса.
Ссылка на ярлык в уведомлении
Вам необходимо указать ярлык общего доступа в уведомлении. Однако вам необходимо создать ярлык, прежде чем отправлять уведомление.
Для этого выполните следующие действия:
- В файле
ConversationFragment.kt
найдите классConversationFragment
. - Перед вызовом переменной
notification
создайте переменнуюshortcut
, которая ссылается на ярлык, созданный изConversationUtil.generateShortcut
. - В методе
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)
...
}
}
- В методе
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)
...
}
}
Запустите приложение
- Запустите приложение.
- В текстовом поле «Сообщение #composers» приложения введите сообщение и нажмите « Отправить» .
- Выйдите из приложения. Вы снова получаете push-уведомление, но оно более четко оформлено как уведомление, связанное с разговором. Значок аватара более выражен и интегрирован со значком приложения. Отправитель, время и текст также стали более оптимизированными.
5. Необязательно: включите пузырьки.
Пузыри были представлены в Android 9, а затем улучшены и перепрофилированы для использования в контексте разговоров в Android 11. Пузыри представляют собой круговые наложения, которые являются аватарами ваших разговоров. Они появляются в панели запуска приложений и позволяют вам легко отвечать на разговоры в расширенной области. Даже если они реализованы, пузырьки не являются обязательными в зависимости от предпочтений пользователя.
Чтобы включить пузырьки, выполните следующие действия:
- В файл
AndroidManifest.xml
добавьте атрибутыallowEmbedded иallowEmbedded
, а затем присвойтеresizeableActivity
true
значение:
AndroidManifest.xml
<activity
...
android:allowEmbedded="true"
android:resizeableActivity="true"
...
</activity>
- В классе
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()
}
- В файле
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()
}
Запустите приложение
- Запустите приложение.
- В текстовом поле «Сообщение #composers» приложения введите сообщение и нажмите « Отправить» .
- Выйдите из приложения. Через несколько секунд вы получите уведомление из чата в виде пузырька.
- Нажмите на пузырь. Разговор открывается из пузыря.
6. Необязательно: поделитесь ссылкой.
Вы объявили цели общего доступа и ссылались на них в своих уведомлениях, что также позволило отобразить ваш контакт в Sharesheet — восходящем компоненте, который появляется при отправке намерения ACTION
. Цели общего доступа отображаются в верхней части таблицы общего доступа и позволяют вам делиться богатым контентом в своих беседах.
Чтобы вызвать Sharesheet, выполните следующие действия:
- На своем устройстве откройте Google Chrome, а затем перейдите на выбранную вами веб-страницу, например, Developer.android.com .
- При необходимости нажмите Более верт .
- Нажмите Делиться . Таблица общего доступа появится в нижней части экрана.
- Если возможно, нажмите ДжетЧат . URL-адрес доступен в чате.
- Если ты не видишь JetChat , нажмите «Еще» , чтобы вызвать общую таблицу системы, а затем проведите пальцем вверх по ShareSheet и нажмите ДжетЧат . URL-адрес будет опубликован в чате.
Это простой пример. Есть более богатые типы контента, которыми можно поделиться. Дополнительную информацию см. в разделе Получение простых данных из других приложений .
7. Поздравления
Поздравляем! Теперь вы знаете, как добавить функции чата в приложение Android с помощью API-интерфейсов Messaging и People. Приятного обмена сообщениями!