Einer Android-App mit den Messaging- und People-APIs Chatfunktionen hinzufügen

1. Hinweis

Die Entwicklung einer Messaging-App ist eine Herausforderung. Die allgemeine Nutzerfreundlichkeit ist zwar subjektiv, aber Android bietet die Messaging API und die People API, die die Chatfunktion verbessern und optimieren.

In diesem Codelab erfahren Sie, wie Sie diese APIs verwenden, um ein überzeugendes Ökosystem für Chat-Apps auf Android zu schaffen. Sie erweitern die JetChat-App, eine einfache, nicht funktionierende Chat-App, die Jetpack Compose verwendet.

Vorbereitung

  • Grundkenntnisse in der Android-Entwicklung
  • Grundlegende Kenntnisse zu Benachrichtigungen

Umfang

Eine erweiterte JetChat-App, die Folgendes bietet:

  • Benachrichtigungen, die Unterhaltungen im reservierten Unterhaltungsbereich der Benachrichtigungsleiste darstellen.
  • Diese Benachrichtigungen enthalten Referenz-Share-Ziele, mit denen Sie Inhalte in den Unterhaltungen Ihrer App teilen können.
  • Es werden Best Practices für die Erstellung dieser Objekte erzwungen, damit die vom System bereitgestellten Standardfunktionen genutzt werden können, die Ihre App verbessern.

Lerninhalte

  • So werden unterhaltungsbezogene Benachrichtigungen im reservierten Unterhaltungsbereich der Benachrichtigungsleiste angezeigt.
  • Informationen zu den verschiedenen Funktionen, die durch die Messaging- und People-APIs ermöglicht werden.

Voraussetzungen

  • Git
  • Android Studio
  • Ein GitHub-Konto

2. Einrichten

Der Ausgangspunkt basiert auf der JetChat-App. Der Startercode erweitert die JetChat-App, um die Messaging- und People-APIs besser zu präsentieren.

Startcode abrufen

So erhalten Sie den Startcode für dieses Codelab:

  1. Klonen Sie das folgende GitHub-Repository über die Befehlszeile:
git clone –branch starter-code \
https://github.com/android/people-messaging-codelab.git
  1. Öffnen Sie das Projekt in Android Studio und klicken Sie dann auf a1bbb9d97659a043.png App ausführen. Der Bereich Emulator wird angezeigt und die App wird darin dargestellt.

Erweiterte JetChat App ausprobieren

  1. Geben Sie im Textfeld Nachrichten-Composers der App eine Nachricht ein und tippen Sie dann auf Senden.
  2. Verlassen Sie die App. Nach einigen Sekunden erhalten Sie eine Push-Benachrichtigung mit einer Antwort von jemandem im Chat.

3. Unterhaltungsbenachrichtigungen erstellen

In Android 11 wurden APIs eingeführt, mit denen chatbezogene Benachrichtigungen in einem bestimmten Bereich in der Benachrichtigungsleiste angezeigt werden können, der ausschließlich für Unterhaltungen vorgesehen ist.

Die Benachrichtigungsleiste, die angezeigt wird, wenn Sie von der Statusleiste nach unten wischen

Die Benachrichtigung muss der Klasse Notification.MessagingStyle angehören und auf eine langlebige Tastenkombination zum Teilen verweisen. In diesem Abschnitt erfahren Sie, wie Sie diese API-Anforderungen erfüllen, um diese Benachrichtigungen, die Konversationen darstellen, im Konversationsbereich anzuzeigen.

So aktivieren Sie Benachrichtigungen der Klasse NotificationCompat.MessagingStyle:

  1. Klicken Sie in Android Studio auf dem Tab Project (Projekt) auf app > java > com.example.compose.jetchat > conversation und doppelklicken Sie dann auf ConversationFragment.
  2. Suchen Sie in der Datei ConversationFragment.kt nach der Klasse ConversationFragment und dann nach dem Codeblock Notification der Funktion createNotification, in dem die Benachrichtigung erstellt wird.
  3. Ersetzen Sie die setContentText-Methode durch eine setStyle-Methode, die den Stil der Benachrichtigung auf die Klasse NotificationCompat.MessagingStyle festlegt. Diese Hilfsklasse fügt der mit der Methode setContextText festgelegten Nachricht zusätzlichen Kontext hinzu, der für die Nachricht relevant ist, z. B. die Uhrzeit, zu der sie gesendet wurde, und die Person, die sie gesendet hat.

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()
}

App ausführen

  1. Starten Sie die App.
  2. Geben Sie im Textfeld Nachrichten-Composers der App eine Nachricht ein und tippen Sie dann auf Senden.
  3. Verlassen Sie die App. Sie erhalten wieder eine Push-Benachrichtigung, die jedoch anders gestaltet ist. Sie enthält einen Avatar und einen bestimmten Stil für die Nachricht. Es gibt jedoch noch einiges zu tun, bevor Ihre Benachrichtigungen dort angezeigt werden, wo sie angezeigt werden sollen.

4. Freigabeziele für Unterhaltungen erstellen

Sie müssen in der Benachrichtigung auf eine Tastenkombination zum Teilen oder ein Ziel zum Teilen verweisen. Freigabeziele werden in der Datei shortcuts.xml definiert und sind die Einstiegspunkte für die Verarbeitung von programmatisch definierten Verknüpfungen. Die von Ihnen erstellten Verknüpfungen stellen die Unterhaltungen in der App dar und ermöglichen es Ihnen, Inhalte in Ihren Unterhaltungen zu teilen.

Ziele für den Anteil definieren

  1. Klicken Sie auf dem Tab Project (Projekt) mit der rechten Maustaste auf das Verzeichnis res und wählen Sie New > Directory (Neu > Verzeichnis) aus.
  2. Geben Sie in das Textfeld xml ein und drücken Sie dann Enter (oder return unter macOS).
  3. Klicken Sie mit der rechten Maustaste auf das Verzeichnis xml und wählen Sie dann Datei aus.
  4. Geben Sie in das Textfeld shortcuts.xml ein und drücken Sie dann Enter (oder return unter macOS).
  5. Deklarieren Sie in der Datei shortcuts.xml das Share-Ziel , das die Freigabe von Daten des Typs text/plain verarbeitet:

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. Klicken Sie auf dem Tab Projekt auf manifests und doppelklicken Sie dann auf AndroidManifest.xml.
  2. Definieren Sie in der Datei AndroidManifest.xml die Datei 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. Definieren Sie in der Komponente activity der Datei AndroidManifest.xml den Intent-Filter, der die Freigabelogik enthält:

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>
...

Tastenkombinationen definieren

Jeder Benachrichtigung muss der entsprechende Kurzbefehl zugeordnet werden. Sie können nur ein eindeutiges Tastenkürzel pro Unterhaltung definieren, da das eindeutige Tastenkürzel den einen Kontakt darstellt, mit dem Sie Inhalte teilen möchten.

So erstellen Sie eine Verknüpfung:

  1. Klicken Sie auf dem Tab Projekt auf app > java > com.example.compose.jetchat > conversation > util und doppelklicken Sie dann auf ConversationUtil.
  2. Fügen Sie in der Datei ConversationUtil.kt eine generateShortcut-Funktion hinzu:

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()
}

Diese Funktion enthält die für die Konversation erforderlichen Methoden setPerson und setLongLived. Die Person ist der Kontakt, der mit der Verknüpfung verknüpft ist. Wenn Sie „long-lived“ auf den Wert true festlegen, wird diese Verknüpfung vom System im Cache gespeichert und auf verschiedenen Oberflächen in der Benutzeroberfläche angezeigt.

Verweisen Sie in der Benachrichtigung auf die Tastenkombination.

Sie müssen in der Benachrichtigung auf die Tastenkombination zum Teilen verweisen. Sie müssen die Verknüpfung jedoch erstellen, bevor Sie die Benachrichtigung senden.

Führen Sie dazu die folgenden Schritte aus:

  1. Suchen Sie in der Datei ConversationFragment.kt nach der Klasse ConversationFragment.
  2. Erstellen Sie vor dem Aufruf der Variablen notification eine Variable shortcut, die auf die von ConversationUtil.generateShortcut generierte Verknüpfung verweist.
  3. Ersetzen Sie in der createNotification-Methode der Variablen notification null durch die Variable shortcut als Parameter.

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. Fügen Sie in der Methode createNotification die Methode NotificationCompat.Builder#setShortcutInfo hinzu und übergeben Sie dann die Variable shortcut als Parameter.

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()
}

Verknüpfung veröffentlichen

  • Rufen Sie zum Veröffentlichen der Verknüpfung in der Funktion simulateResponseAsANotification vor der Methode notificationManager.notify die Methode pushDynamicShortcut auf:

ConversationFragment.kt

import androidx.core.content.pm.ShortcutManagerCompat

...private fun simulateResponseAsANotification() {
   ...
   if (message.author != "me") {
       ...
       ShortcutManagerCompat.pushDynamicShortcut(context!!, shortcut)
       ...
   }
}

App ausführen

  1. Starten Sie die App.
  2. Geben Sie im Textfeld Nachrichten-Composers der App eine Nachricht ein und tippen Sie dann auf Senden.
  3. Verlassen Sie die App. Sie erhalten wieder eine Push-Benachrichtigung, die jedoch deutlicher als Unterhaltungsbenachrichtigung gestaltet ist. Das Avatarsymbol ist deutlicher zu sehen und enthält das App-Symbol. Absender, Uhrzeit und Text sind ebenfalls übersichtlicher.

5. Optional: Bubbles aktivieren

Bubbles wurden in Android 9 eingeführt und in Android 11 verbessert und für die Verwendung im Kontext von Unterhaltungen neu ausgerichtet. Blasen sind kreisförmige Overlays, die als Avatare für Ihre Unterhaltungen dienen. Sie werden im App-Launcher angezeigt und ermöglichen es Ihnen, ganz einfach in einer maximierten Bubble auf Unterhaltungen zu antworten. Auch wenn Blasen implementiert sind, sind sie je nach Nutzereinstellung optional.

So aktivieren Sie Blasen:

  1. Fügen Sie in der Datei AndroidManifest.xml die Attribute allowEmbedded und resizeableActivity hinzu und legen Sie für jedes den Wert true fest:

AndroidManifest.xml

<activity
  ...
  android:allowEmbedded="true"
  android:resizeableActivity="true"
  ...
</activity>
  1. Fügen Sie in der Klasse ConversationUtil der Datei ConversationUtil.kt die Blasenmetadaten hinzu:

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. Erstellen Sie in der Datei ConversationFragment.kt die Blasenmetadaten für die Benachrichtigung und verweisen Sie darauf:

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()
}

App ausführen

  1. Starten Sie die App.
  2. Geben Sie im Textfeld Nachrichten-Composers der App eine Nachricht ein und tippen Sie dann auf Senden.
  3. Verlassen Sie die App. Nach einigen Sekunden erhalten Sie eine Benachrichtigung vom Chat in Form einer Bubble.
  4. Tippe auf die Bubble. Die Unterhaltung wird über die Bubble geöffnet.

Eine Unterhaltungsblase

6. Optional: Link teilen

Sie haben Freigabeziele deklariert und in Ihren Benachrichtigungen darauf verwiesen. Dadurch wird Ihr Kontakt auch im Sharesheet angezeigt, einer Bottom-up-Komponente, die erscheint, wenn ein ACTION-Intent gesendet wird. Die Freigabeziele werden oben im Freigabe-Sheet angezeigt. So können Sie Rich Content in Ihren Unterhaltungen teilen.

So rufen Sie das Freigabeblatt auf:

  1. Öffnen Sie auf Ihrem Gerät Google Chrome und rufen Sie dann eine beliebige Webseite auf, z. B. developer.android.com.
  2. Klicken Sie bei Bedarf auf das Dreipunkt-Menü 2fdbaccda71bc5f0.png.
  3. Klicken Sie auf 771b0be21764f6b6.png Teilen. Das Freigabeblatt wird unten auf dem Bildschirm angezeigt.

Das Sharesheet

  1. Klicken Sie nach Möglichkeit auf 468248e6b8a84bb3.png JetChat. Die URL wird im Chat geteilt.
  2. Wenn Sie 468248e6b8a84bb3.png JetChat nicht sehen, klicken Sie auf 145399af71577431.png Mehr, um das System-ShareSheet aufzurufen. Wischen Sie dann im ShareSheet nach oben und klicken Sie auf 468248e6b8a84bb3.png JetChat. Die URL wird im Chat geteilt.

Dies ist ein einfaches Beispiel. Es gibt umfangreichere Inhaltstypen, die Sie teilen können. Weitere Informationen finden Sie unter Einfache Daten von anderen Apps abrufen.

7. Glückwunsch

Glückwunsch! Jetzt wissen Sie, wie Sie Chatfunktionen in Android-Apps implementieren mit der Messaging API und der People API. Viel Spaß beim Messaging!

Weitere Informationen