1. Zanim zaczniesz
Tworzenie komunikatora jest trudne. Ogólne wrażenia użytkownika są subiektywne, ale Android udostępnia interfejsy Messaging API i People API, które poprawiają i usprawniają korzystanie z czatu.
Z tego ćwiczenia dowiesz się, jak używać tych interfejsów API do tworzenia atrakcyjnego ekosystemu aplikacji do czatowania na Androidzie. Rozszerzysz aplikację JetChat, czyli prostą i niefunkcjonalną aplikację do obsługi czatu, która korzysta z Jetpack Compose.
Wymagania wstępne
- Podstawowa wiedza o programowaniu na Androida
- Podstawowa wiedza o powiadomieniach
Co utworzysz
Rozszerzona aplikacja JetChat, która:
- Wyświetla powiadomienia dotyczące rozmów w zarezerwowanej sekcji rozmów w panelu powiadomień.
- W tych powiadomieniach znajdują się odwołania do miejsc docelowych, które umożliwiają udostępnianie treści w rozmowach w aplikacji.
- Wymusza stosowanie sprawdzonych metod tworzenia tych obiektów, aby korzystać z domyślnych funkcji systemu, które ulepszają aplikację.
Czego się nauczysz
- Jak wyświetlać powiadomienia związane z rozmowami w zarezerwowanej sekcji rozmów w panelu powiadomień.
- Jak zrozumieć różne funkcje udostępniane przez interfejsy Messaging API i People API.
Czego potrzebujesz
- Git
- Android Studio
- konto GitHub,
2. Konfiguracja
Punktem wyjścia jest aplikacja JetChat. Kod startowy rozszerza aplikację JetChat, aby lepiej prezentować interfejsy Messaging i People API.
Pobierz kod startowy
Aby uzyskać kod startowy do tego ćwiczenia, wykonaj te czynności:
- W wierszu poleceń sklonuj to repozytorium GitHub:
git clone –branch starter-code \ https://github.com/android/people-messaging-codelab.git
- Otwórz projekt w Android Studio, a potem kliknij
Uruchom aplikację. Pojawi się panel Emulator, na którym będzie widoczna aplikacja.
Poznaj rozszerzoną aplikację JetChat
- W polu tekstowym Kompozytor wiadomości w aplikacji wpisz wiadomość, a potem kliknij Wyślij.
- Wyjdź z aplikacji. Po kilku sekundach otrzymasz powiadomienie push z odpowiedzią od kogoś na czacie.
3. Tworzenie powiadomień o rozmowach
W Androidzie 11 wprowadziliśmy interfejsy API, które umożliwiają wyświetlanie powiadomień związanych z czatem w wyznaczonej sekcji w panelu powiadomień, która jest przeznaczona wyłącznie na rozmowy.

Powiadomienie musi należeć do klasy Notification.MessagingStyle i odwoływać się do długoterminowego skrótu do udostępniania. W tej sekcji dowiesz się, jak spełnić te wymagania interfejsu API, aby wyświetlać w sekcji rozmów powiadomienia reprezentujące rozmowy.
Aby utworzyć powiadomienia klasy NotificationCompat.MessagingStyle, wykonaj te czynności:
- Na karcie Project (Projekt) w Android Studio kliknij kolejno
app>java>com.example.compose.jetchat>conversation, a potem dwukrotnie kliknijConversationFragment. - W pliku
ConversationFragment.ktznajdź klasęConversationFragment, a następnie blok koduNotificationfunkcjicreateNotification, w którym tworzone jest powiadomienie. - Zastąp metodę
setContentTextmetodąsetStyle, która ustawia styl powiadomienia na klasęNotificationCompat.MessagingStyle. Ta klasa pomocnicza dodaje wiadomość ustawioną za pomocą metodysetContextTextwraz z dodatkowym kontekstem związanym z wiadomością, takim jak czas wysłania i osoba, która ją wysłała.
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()
}
Uruchamianie aplikacji
- Uruchom aplikację.
- W polu tekstowym Kompozytor wiadomości w aplikacji wpisz wiadomość, a potem kliknij Wyślij.
- Wyjdź z aplikacji. Ponownie otrzymasz powiadomienie push, ale będzie ono wyglądać inaczej. Zawiera awatar i wyróżniający się styl wiadomości. Zanim jednak powiadomienia zaczną się wyświetlać w odpowiednich miejscach, musisz wykonać jeszcze kilka czynności.
4. Tworzenie celów udostępniania dla rozmów
W powiadomieniu musisz odwołać się do skrótu do udostępniania lub elementu docelowego udostępniania. Cele udostępniania są zdefiniowane w pliku shortcuts.xml i stanowią punkty wejścia do obsługi skrótów zdefiniowanych programowo. Utworzone skróty reprezentują rozmowy w aplikacji i umożliwiają udostępnianie treści w rozmowach.
Określanie docelowych udziałów
- Na karcie Project (Projekt) kliknij prawym przyciskiem myszy katalog
res, a następnie wybierz New > Directory (Nowy > Katalog). - W polu tekstowym wpisz
xml, a następnie naciśnijEnter(lubreturnw systemie macOS). - Kliknij prawym przyciskiem myszy katalog
xml, a następnie wybierz Plik. - W polu tekstowym wpisz
shortcuts.xml, a następnie naciśnijEnter(lubreturnw systemie macOS). - W pliku
shortcuts.xmlzadeklaruj element docelowy udostępniania , który obsługuje udostępnianie danych typutext/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>
- Na karcie Projekt kliknij
manifests, a następnie dwukrotnie kliknijAndroidManifest.xml. - W pliku
AndroidManifest.xmlzdefiniuj plikshortcuts.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>
- W komponencie
activityplikuAndroidManifest.xmlzdefiniuj filtr intencji, który zawiera logikę udostępniania:
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>
...
Definiowanie skrótów
Z każdym powiadomieniem musisz powiązać odpowiedni skrót. Możesz zdefiniować tylko jeden unikalny skrót dla każdego wątku, ponieważ unikalny skrót reprezentuje jeden kontakt, z którym chcesz udostępniać treści.
Aby wygenerować skrót, wykonaj te czynności:
- Na karcie Projekt kliknij
app>java>com.example.compose.jetchat>conversation>util, a potem kliknij dwukrotnieConversationUtil. - W pliku
ConversationUtil.ktdodaj funkcję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()
}
Ta funkcja zawiera metody setPerson i setLongLived wymagane do prowadzenia rozmowy. Osoba jest kontaktem powiązanym ze skrótem, a ustawienie długotrwałości na wartość true zapewnia, że skrót jest przechowywany w pamięci podręcznej systemu i wyświetlany w różnych miejscach interfejsu.
Odwołaj się do skrótu w powiadomieniu.
W powiadomieniu musisz odwołać się do skrótu do udostępniania. Musisz jednak utworzyć skrót, zanim wyślesz powiadomienie.
W tym celu wykonaj następujące czynności:
- W pliku
ConversationFragment.ktznajdź klasęConversationFragment. - Przed wywołaniem zmiennej
notificationutwórz zmiennąshortcut, która odwołuje się do skrótu wygenerowanego przezConversationUtil.generateShortcut. - W metodzie
createNotificationzmiennejnotificationzastąpnullzmiennąshortcutjako parametr.
ConversationFragment.kt
private fun simulateResponseAsANotification() {
...
if (message.author != "me") {
...
val shortcut = ConversationUtil.generateShortcut(context!!, message.author)
val notification = createNotification(notificationId, message, person, shortcut, time)
...
}
}
- W metodzie
createNotificationdodaj metodęNotificationCompat.Builder#setShortcutInfo, a następnie przekaż zmiennąshortcutjako parametr.
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()
}
Opublikuj skrót
- Aby opublikować skrót, w funkcji
simulateResponseAsANotificationprzed metodąnotificationManager.notifywywołaj metodępushDynamicShortcut:
ConversationFragment.kt
import androidx.core.content.pm.ShortcutManagerCompat
...private fun simulateResponseAsANotification() {
...
if (message.author != "me") {
...
ShortcutManagerCompat.pushDynamicShortcut(context!!, shortcut)
...
}
}
Uruchamianie aplikacji
- Uruchom aplikację.
- W polu tekstowym Kompozytor wiadomości w aplikacji wpisz wiadomość, a potem kliknij Wyślij.
- Wyjdź z aplikacji. Ponownie otrzymasz powiadomienie push, ale będzie ono bardziej wyraźnie oznaczone jako powiadomienie związane z rozmową. Ikona awatara jest bardziej widoczna i zawiera ikonę aplikacji. Nadawca, czas i tekst są też bardziej przejrzyste.
5. Opcjonalnie: włącz dymki
Dymki zostały wprowadzone w Androidzie 9, a w Androidzie 11 zostały ulepszone i przeznaczone do użytku w kontekście rozmów. Dymki to okrągłe nakładki, które są awatarami Twoich rozmów. Pojawiają się w programie uruchamiającym i ułatwiają odpowiadanie na rozmowy w rozwiniętym dymku. Nawet po wdrożeniu dymki są opcjonalne i zależą od preferencji użytkownika.
Aby włączyć dymki, wykonaj te czynności:
- W pliku
AndroidManifest.xmldodaj atrybutyallowEmbeddediresizeableActivity, a następnie ustaw dla każdego z nich wartośćtrue:
AndroidManifest.xml
<activity
...
android:allowEmbedded="true"
android:resizeableActivity="true"
...
</activity>
- W klasie
ConversationUtilplikuConversationUtil.ktdodaj metadane dymku:
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()
}
- W pliku
ConversationFragment.ktutwórz metadane dymku i odwołaj się do nich w powiadomieniu:
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()
}
Uruchamianie aplikacji
- Uruchom aplikację.
- W polu tekstowym Kompozytor wiadomości w aplikacji wpisz wiadomość, a potem kliknij Wyślij.
- Wyjdź z aplikacji. Po kilku sekundach otrzymasz powiadomienie z czatu w formie dymka.
- Kliknij dymek. Rozmowa otworzy się w dymku.

6. Opcjonalnie: udostępnij link
Zadeklarowano cele udostępniania i odniesiono się do nich w powiadomieniach, co umożliwiło też wyświetlanie kontaktu w arkuszu udostępniania – komponencie wyświetlanym od dołu, który pojawia się po wysłaniu intencji ACTION. Elementy docelowe udostępniania pojawiają się u góry arkusza udostępniania i umożliwiają udostępnianie w rozmowach szczegółowych treści.
Aby wywołać arkusz udostępniania, wykonaj te czynności:
- Na urządzeniu otwórz Google Chrome, a potem przejdź na wybraną stronę internetową, np. developer.android.com.
- W razie potrzeby kliknij
Więcej. - Kliknij
Udostępnij. U dołu ekranu pojawi się arkusz udostępniania.

- Jeśli to możliwe, kliknij
JetChat. URL zostanie udostępniony na czacie. - Jeśli nie widzisz opcji
JetChat, kliknij
Więcej, aby wywołać arkusz udostępniania systemu, a następnie przesuń palcem w górę po arkuszu udostępniania i kliknij
JetChat. Adres URL zostanie udostępniony na czacie.
To prosty przykład. Możesz udostępniać bardziej rozbudowane typy treści. Więcej informacji znajdziesz w artykule Odbieranie prostych danych z innych aplikacji.
7. Gratulacje
Gratulacje! Teraz wiesz już, jak dodawać funkcje związane z czatem do aplikacji na Androida za pomocą interfejsów Messaging API i People API. Miłego korzystania z wiadomości!