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

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:

  1. W wierszu poleceń sklonuj to repozytorium GitHub:
git clone –branch starter-code \
https://github.com/android/people-messaging-codelab.git
  1. Otwórz projekt w Android Studio, a potem kliknij a1bbb9d97659a043.png Uruchom aplikację. Pojawi się panel Emulator, na którym będzie widoczna aplikacja.

Poznaj rozszerzoną aplikację JetChat

  1. W polu tekstowym Kompozytor wiadomości w aplikacji wpisz wiadomość, a potem kliknij Wyślij.
  2. 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.

szuflada powiadomień, która pojawia się po przesunięciu palcem z góry na dół paska stanu;

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:

  1. Na karcie Project (Projekt) w Android Studio kliknij kolejno app >java >com.example.compose.jetchat >conversation, a potem dwukrotnie kliknij ConversationFragment.
  2. W pliku ConversationFragment.kt znajdź klasę ConversationFragment, a następnie blok kodu Notification funkcji createNotification, w którym tworzone jest powiadomienie.
  3. Zastąp metodę setContentText metodą setStyle, która ustawia styl powiadomienia na klasę NotificationCompat.MessagingStyle. Ta klasa pomocnicza dodaje wiadomość ustawioną za pomocą metody setContextText wraz 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

  1. Uruchom aplikację.
  2. W polu tekstowym Kompozytor wiadomości w aplikacji wpisz wiadomość, a potem kliknij Wyślij.
  3. 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

  1. Na karcie Project (Projekt) kliknij prawym przyciskiem myszy katalog res, a następnie wybierz New > Directory (Nowy > Katalog).
  2. W polu tekstowym wpisz xml, a następnie naciśnij Enter (lub return w systemie macOS).
  3. Kliknij prawym przyciskiem myszy katalog xml, a następnie wybierz Plik.
  4. W polu tekstowym wpisz shortcuts.xml, a następnie naciśnij Enter (lub return w systemie macOS).
  5. W pliku shortcuts.xml zadeklaruj element docelowy udostępniania , który 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 zdefiniuj 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, 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:

  1. Na karcie Projekt kliknij app >java >com.example.compose.jetchat >conversation >util, a potem kliknij dwukrotnie 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 setPersonsetLongLived 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:

  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 przez ConversationUtil.generateShortcut.
  3. W metodzie createNotification zmiennej notification zastąp null zmienną shortcut jako 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)
       ...
   }
}
  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)
       ...
   }
}

Uruchamianie aplikacji

  1. Uruchom aplikację.
  2. W polu tekstowym Kompozytor wiadomości w aplikacji wpisz wiadomość, a potem kliknij Wyślij.
  3. 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:

  1. W pliku AndroidManifest.xml dodaj atrybuty allowEmbeddedresizeableActivity, a następnie ustaw dla każdego z nich 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 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

  1. Uruchom aplikację.
  2. W polu tekstowym Kompozytor wiadomości w aplikacji wpisz wiadomość, a potem kliknij Wyślij.
  3. Wyjdź z aplikacji. Po kilku sekundach otrzymasz powiadomienie z czatu w formie dymka.
  4. Kliknij dymek. Rozmowa otworzy się w dymku.

dymek rozmowy,

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:

  1. Na urządzeniu otwórz Google Chrome, a potem przejdź na wybraną stronę internetową, np. developer.android.com.
  2. W razie potrzeby kliknij 2fdbaccda71bc5f0.png Więcej.
  3. Kliknij 771b0be21764f6b6.png Udostępnij. U dołu ekranu pojawi się arkusz udostępniania.

Arkusz udostępniania

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

Więcej informacji