1. Zanim zaczniesz
Stworzenie komunikatora jest trudne. Chociaż ogólne wrażenia użytkowników są subiektywne, Android zapewnia interfejsy Messaging i People API, które ulepszają i upraszczają obsługę czatu.
Z tego ćwiczenia w programie dowiesz się, jak używać tych interfejsów API do stworzenia atrakcyjnego ekosystemu aplikacji do obsługi czatu na Androida. Rozszerzasz aplikację JetChat, czyli prostą i niefunkcjonalną aplikację do obsługi czatu, która korzysta z Jetpack compose.
Wymagania wstępne
- Podstawowa wiedza o programowaniu aplikacji na Androida
- Podstawowa znajomość powiadomień
Co utworzysz
Rozszerzona aplikacja JetChat, która:
- Wyświetla powiadomienia reprezentujące wątki w zarezerwowanej sekcji rozmów w panelu powiadomień.
- Pliki referencyjne udostępniają cele w tych powiadomieniach, co pozwala udostępniać treści w rozmowach w aplikacji.
- Egzekwuje sprawdzone metody tworzenia tych obiektów, aby korzystać z domyślnych ustawień zapewnianych przez system, które ulepszają aplikację.
Czego się nauczysz
- Jak wyświetlać powiadomienia związane z rozmowami w sekcji zarezerwowanej rozmowy w panelu powiadomień.
- Omówienie różnych funkcji dostępnych w interfejsach Messaging API i People API.
Czego potrzebujesz
- Git
- Android Studio
- konto GitHub
2. Konfiguracja
Punktem wyjścia jest aplikacja JetChat. Kod startowy rozszerza możliwości aplikacji JetChat, aby lepiej prezentować interfejsy Messaging i People API.
Pobierz kod startowy
Aby uzyskać kod startowy tego ćwiczenia z programowania, wykonaj te czynności:
- W wierszu poleceń skopiuj następujące repozytorium GitHub:
git clone –branch starter-code \ https://github.com/android/people-messaging-codelab.git
- Otwórz projekt w Android Studio i kliknij
Uruchom aplikację. Pojawi się panel Emulator, w którym zobaczysz aplikację.
Odkryj rozszerzoną aplikację JetChat
- W polu tekstowym Message #composers aplikacji wpisz wiadomość, a następnie kliknij Wyślij.
- Zamknij aplikację. Po kilku sekundach otrzymasz powiadomienie push z odpowiedzią od jednego z uczestników czatu.
3. Tworzenie powiadomień dotyczących rozmów
W Androidzie 11 wprowadziliśmy interfejsy API, które umożliwiają wyświetlanie powiadomień związanych z czatem w wyznaczonej sekcji w panelu powiadomień. Przeznaczona jest ona wyłącznie na rozmowy.
Powiadomienie musi dotyczyć klasy Notification.MessagingStyle
i odnosić się do długotrwałego skrótu do udostępniania. Z tej sekcji dowiesz się, jak spełnić wymagania interfejsu API, aby wyświetlać powiadomienia reprezentujące rozmowy w sekcji rozmów.
Aby otrzymywać powiadomienia o zajęciach w NotificationCompat.MessagingStyle
, wykonaj te czynności:
- Na karcie Projekt w Android Studio kliknij
app
.java
com.example.compose.jetchat
conversation
, a następnie kliknij dwukrotnieConversationFragment
. - W pliku
ConversationFragment.kt
znajdź klasęConversationFragment
, a następnie znajdź blok koduNotification
funkcjicreateNotification
, w którym zostało utworzone powiadomienie. - Zastąp metodę
setContentText
metodąsetStyle
, która ustawia styl powiadomienia na klasęNotificationCompat.MessagingStyle
. Ta klasa pomocnicza dodaje wiadomość ustawioną przy użyciu metodysetContextText
z dodatkowym kontekstem związanym z wiadomością, takim jak czas jej 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()
}
Uruchom aplikację
- Uruchom aplikację.
- W polu tekstowym Message #composers aplikacji wpisz wiadomość, a następnie kliknij Wyślij.
- Zamknij aplikację. Ponownie otrzymasz powiadomienie push, ale ma ono inny styl. Zawiera awatar i charakterystyczny styl wiadomości. Zanim powiadomienia pojawią się w odpowiednich miejscach, musisz wykonać jeszcze więcej czynności.
4. Tworzenie celów udostępniania dla rozmów
Musisz dodać w powiadomieniu odwołanie do skrótu do udostępniania lub miejsce docelowe udostępniania. Miejsca docelowe udostępniania są zdefiniowane w pliku shortcuts.xml
i stanowią punkty wejścia do obsługi skrótów, które są definiowane automatycznie. Utworzone przez Ciebie skróty reprezentują rozmowy w aplikacji i umożliwiają udostępnianie treści w rozmowach.
Definiowanie docelowych wartości udziału
- Na karcie Projekt kliknij prawym przyciskiem myszy katalog
res
i wybierz Nowy > Katalog. - W polu tekstowym wpisz
xml
i naciśnijEnter
(lubreturn
w systemie macOS). - Kliknij prawym przyciskiem myszy katalog
xml
, a następnie wybierz File (Plik). - W polu tekstowym wpisz
shortcuts.xml
i naciśnijEnter
(lubreturn
w systemie macOS). - W pliku
shortcuts.xml
zadeklaruj miejsce docelowe udostępniania , które 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.xml
określ 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
activity
plikuAndroidManifest.xml
zdefiniuj filtr intencji zawierający 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. Definiujesz tylko jeden unikalny skrót na wątek, ponieważ unikalny skrót reprezentuje jeden kontakt, któremu chcesz udostępnić treść.
Aby wygenerować skrót, wykonaj te czynności:
- Na karcie Projekt kliknij
app
.java
com.example.compose.jetchat
conversation
util
i dwukrotnie kliknijConversationUtil
. - W pliku
ConversationUtil.kt
dodaj 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. Ustawienie wartości true
jako długotrwałej wartości powoduje, że ten skrót jest buforowany przez system i wyświetlany na różnych platformach interfejsu.
Korzystaj ze skrótu w powiadomieniu
Musisz wspomnieć w powiadomieniu o skrótie do udostępniania. Musisz jednak utworzyć skrót przed wypchnięciem powiadomienia.
W tym celu wykonaj następujące czynności:
- W pliku
ConversationFragment.kt
znajdź klasęConversationFragment
. - Przed wywołaniem zmiennej
notification
utwórz zmiennąshortcut
, która odwołuje się do skrótu wygenerowanego na podstawie metodyConversationUtil.generateShortcut
. - W metodzie
createNotification
zmiennejnotification
zastąpnull
zmiennąshortcut
jako parametrem.
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
createNotification
dodaj metodęNotificationCompat.Builder#setShortcutInfo
, a następnie przekaż zmiennąshortcut
jako 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
simulateResponseAsANotification
przed metodąnotificationManager.notify
wywołaj metodępushDynamicShortcut
:
ConversationFragment.kt
import androidx.core.content.pm.ShortcutManagerCompat
...private fun simulateResponseAsANotification() {
...
if (message.author != "me") {
...
ShortcutManagerCompat.pushDynamicShortcut(context!!, shortcut)
...
}
}
Uruchom aplikację
- Uruchom aplikację.
- W polu tekstowym Message #composers aplikacji wpisz wiadomość, a następnie kliknij Wyślij.
- Zamknij aplikację. Otrzymujesz ponownie powiadomienie push, ale ma ono bardziej wyrazisty charakter jako powiadomienie związane z rozmową. Bardziej wyrazista ikona awatara, łączy się z ikoną aplikacji. W prostszy sposób uproszczona obsługa nadawcy, godziny i tekstu.
5. Opcjonalnie: włącz dymki
Dymki pojawiły się w Androidzie 9, zostały ulepszone i ponownie wykorzystane w kontekście rozmów w Androidzie 11. Dymki to okrągłe nakładki, które są awatarami Twoich rozmów. Wyświetlają się one w menu z aplikacjami i pozwalają łatwo odpowiadać na rozmowy w rozwiniętym dymku. Nawet po wdrożeniu dymki są opcjonalne, w zależności od preferencji użytkownika.
Aby włączyć dymki, wykonaj te czynności:
- W pliku
AndroidManifest.xml
dodaj atrybutyallowEmbedded
iresizeableActivity
, a następnie ustaw każdy z nich na wartośćtrue
:
AndroidManifest.xml
<activity
...
android:allowEmbedded="true"
android:resizeableActivity="true"
...
</activity>
- W klasie
ConversationUtil
plikuConversationUtil.kt
dodaj 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.kt
utwórz metadane dymka 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()
}
Uruchom aplikację
- Uruchom aplikację.
- W polu tekstowym Message #composers aplikacji wpisz wiadomość, a następnie kliknij Wyślij.
- Zamknij aplikację. Po kilku sekundach otrzymasz powiadomienie z czatu w formie dymka.
- Kliknij dymek. Rozmowa otworzy się w dymku.
6. Opcjonalnie: udostępnianie linku
Zadeklarowano cele udostępniania i odwoływano się do nich w powiadomieniach, co spowodowało również wyświetlenie kontaktu w arkuszu udostępniania – oddolnym komponencie pojawiającym się po wysłaniu intencji ACTION
. Cele udostępniania są wyświetlane u góry arkusza udostępniania i umożliwiają udostępnianie szczegółowych treści w rozmowach.
Aby wywołać arkusz udostępniania, wykonaj te czynności:
- Na urządzeniu otwórz Google Chrome, a następnie przejdź do wybranej strony internetowej, np. developer.android.com.
- W razie potrzeby kliknij
Więcej wer.
- Kliknij
Udostępnij. Arkusz udostępniania zostanie wyświetlony u dołu ekranu.
- Jeśli to możliwe, kliknij
JetChat. Adres URL jest udostępniany na czacie.
- Jeśli nie widzisz
JetChat, kliknij
Więcej, aby wywołać systemowy arkusz udostępniania, a następnie przesuń palcem w górę arkusza udostępniania i kliknij
JetChat. Adres URL zostanie udostępniony na czacie.
To prosty przykład. Możesz udostępniać bogatsze typy treści. Więcej informacji znajdziesz w artykule Pobieranie prostych danych z innych aplikacji.
7. Gratulacje
Gratulacje! Wiesz już, jak dodać funkcje czatu do aplikacji na Androida przy użyciu interfejsów API do obsługi wiadomości i osób. Powodzenia!