Dodawanie funkcji związanych z czatem do aplikacji na Androida za pomocą interfejsów Messaging i People API

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:

  1. W wierszu poleceń skopiuj następujące repozytorium GitHub:
git clone –branch starter-code \
https://github.com/android/people-messaging-codelab.git
  1. Otwórz projekt w Android Studio i kliknij a1bbb9d97659a043.png Uruchom aplikację. Pojawi się panel Emulator, w którym zobaczysz aplikację.

Odkryj rozszerzoną aplikację JetChat

  1. W polu tekstowym Message #composers aplikacji wpisz wiadomość, a następnie kliknij Wyślij.
  2. 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.

Panel powiadomień, który pojawia się po przesunięciu palcem w dół od paska stanu.

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:

  1. Na karcie Projekt w Android Studio kliknij app. java com.example.compose.jetchat conversation, a następnie kliknij dwukrotnie ConversationFragment.
  2. W pliku ConversationFragment.kt znajdź klasę ConversationFragment, a następnie znajdź blok kodu Notification funkcji createNotification, w którym zostało utworzone powiadomienie.
  3. Zastąp metodę setContentText metodą setStyle, która ustawia styl powiadomienia na klasę NotificationCompat.MessagingStyle. Ta klasa pomocnicza dodaje wiadomość ustawioną przy użyciu metody setContextText 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ę

  1. Uruchom aplikację.
  2. W polu tekstowym Message #composers aplikacji wpisz wiadomość, a następnie kliknij Wyślij.
  3. 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

  1. Na karcie Projekt kliknij prawym przyciskiem myszy katalog res i wybierz Nowy > Katalog.
  2. W polu tekstowym wpisz xml i naciśnij Enter (lub return w systemie macOS).
  3. Kliknij prawym przyciskiem myszy katalog xml, a następnie wybierz File (Plik).
  4. W polu tekstowym wpisz shortcuts.xml i naciśnij Enter (lub return w systemie macOS).
  5. W pliku shortcuts.xml zadeklaruj miejsce docelowe udostępniania , które obsługuje udostępnianie danych typu 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. Na karcie Projekt kliknij manifests, a następnie dwukrotnie kliknij AndroidManifest.xml.
  2. W pliku AndroidManifest.xml określ plik 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. W komponencie activity pliku AndroidManifest.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:

  1. Na karcie Projekt kliknij app. java com.example.compose.jetchat conversation util i dwukrotnie kliknij ConversationUtil.
  2. 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:

  1. W pliku ConversationFragment.kt znajdź klasę ConversationFragment.
  2. Przed wywołaniem zmiennej notification utwórz zmienną shortcut, która odwołuje się do skrótu wygenerowanego na podstawie metody ConversationUtil.generateShortcut.
  3. W metodzie createNotification zmiennej notification zastąp null 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)
       ...
   }
}
  1. 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ę

  1. Uruchom aplikację.
  2. W polu tekstowym Message #composers aplikacji wpisz wiadomość, a następnie kliknij Wyślij.
  3. 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:

  1. W pliku AndroidManifest.xml dodaj atrybuty allowEmbedded i resizeableActivity, a następnie ustaw każdy z nich na wartość true:

AndroidManifest.xml

<activity
  ...
  android:allowEmbedded="true"
  android:resizeableActivity="true"
  ...
</activity>
  1. W klasie ConversationUtil pliku ConversationUtil.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()
    }
  1. 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ę

  1. Uruchom aplikację.
  2. W polu tekstowym Message #composers aplikacji wpisz wiadomość, a następnie kliknij Wyślij.
  3. Zamknij aplikację. Po kilku sekundach otrzymasz powiadomienie z czatu w formie dymka.
  4. Kliknij dymek. Rozmowa otworzy się w dymku.

Dymek rozmowy

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:

  1. Na urządzeniu otwórz Google Chrome, a następnie przejdź do wybranej strony internetowej, np. developer.android.com.
  2. W razie potrzeby kliknij 2fdbaccda71bc5f0.png Więcej wer.
  3. Kliknij 771b0be21764f6b6.png Udostępnij. Arkusz udostępniania zostanie wyświetlony u dołu ekranu.

Arkusz udostępniania

  1. Jeśli to możliwe, kliknij 468248e6b8a84bb3.png JetChat. Adres URL jest udostępniany na czacie.
  2. Jeśli nie widzisz 468248e6b8a84bb3.png JetChat, kliknij 145399af71577431.png Więcej, aby wywołać systemowy arkusz udostępniania, a następnie przesuń palcem w górę arkusza udostępniania i kliknij 468248e6b8a84bb3.png 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!

Więcej informacji