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 zapewnianych 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 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
Do każdego powiadomienia musisz przypisać odpowiedni skrót. Definiujesz tylko jeden unikalny skrót na rozmowę, 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!