Auto-Messenger

Car Messenger bietet Nachrichtenfunktionen, die speziell für Geräte in Fahrzeugen entwickelt wurden. Wie bei anderen Auto-Apps starten Nutzer Car Messenger über den Launcher.

Was ist neu bei Car Messenger?

Mit der neuen Car Messenger App können Fahrer:

  • Sie erhalten eine spezielle Messaging-Funktion.
  • Starten Sie Car Messenger über den Launcher.
  • Sie können Nachrichten aufrufen, die vor und während einer Fahrt empfangen wurden.
  • Nachrichten anhören und beantworten
  • Nachrichtenbenachrichtigungen stummschalten.
  • Neue Unterhaltungen starten.

Terminologie

Auf dieser Seite werden die folgenden Begriffe verwendet:

„Zum Lesen antippen“
Mit „Zum Lesen tippen“ können Sprachassistenten Nachrichten im Namen des Nutzers lesen und beantworten, wenn der Nutzer mit Nachrichtenbenachrichtigungen interagiert.

Direkte Antwort
Ähnlich wie „Zum Lesen antippen“, mit dem Unterschied, dass der Sprachassistent die Nachricht nicht vorliest, sondern sofort eine Aufforderung zur Antwort gibt.

Direkter Versand
Er kann mit einem Sprachassistenten verbunden werden, um einen neuen Nachrichtenablauf mit oder ohne einen bestimmten Kontakt zu erstellen.

Vorteile von nicht gebündelten Apps

Nicht in Bundles enthaltene Apps wie Car Messenger bieten folgende Vorteile:

  • Es werden nur öffentliche Methoden verwendet (keine Plattformabhängigkeiten von ausgeblendeten APIs)
  • Apps außerhalb der Android-Plattform entwickeln
  • Häufigere Releases aktivieren (für neue Funktionen und behobene Probleme)
  • Apps über Google Play aktualisieren

Weitere Informationen zu nicht gebündelten Apps

Technische Details

In diesem Abschnitt wird die Architektur von Car Messenger beschrieben. Weitere Informationen finden Sie unter CarVoiceInteractionSession einbinden.

Telefonbasierte Architektur

Bei der Kopplung über Bluetooth werden Daten aus der Telefondatenbank des Smartphones mit der Telefondatenbank des Autos synchronisiert. Wenn die Bluetooth-Verbindung getrennt wird, werden die synchronisierten Daten aus der Telefoniedatenbank des Autos gelöscht.

Diese Funktion wurde in Android 12 eingeführt. Zu den wichtigsten Vorteilen gehören:

  • Nutzernachrichten im Bulk-Verfahren können aus einer Datenbank abgerufen werden.
  • Nachrichten von früheren Fahrten werden unterstützt.
  • Verwendet eine ähnliche Architektur und API für die Speicherung und den Abruf von SMS auf Android-Smartphones.
  • Die Verknüpfung mit der Android-Plattform wird vollständig aufgehoben.

So funktioniert es:

Telefonbasierter Datenfluss Abbildung 1: Telefonbasierter Datenfluss.

Ablauf im Textformat:

 1. Phone connects to car.
    |
    --> 2. SMS data transferred from phone's database to car database.
          |
          --> 3. Car Messenger retrieves data from telephony database to display on UI.
                  |
                  --> 4. User interactions prompt the voice assistant.
                  |
          <-- 5. Car Messenger receives reply action from the voice assistant.
          |
    <-- 6. SMS is marked as read in car database.
    |
 7. Reply transmitted to recipients, phone database updated with reply and read status.

So gehen wir mit den Daten um:

Datennutzung von Car Messenger Abbildung 2 Datenverarbeitung durch Car Messenger

Ablauf im Textformat:

 1. Phone connects to car.
    |
    --> 2. SMS data transferred from phone's database to car database.
          |
          --> 3. Phone disconnects from car.
                  |
                  --> 4. SMS data deleted from car telephony database.
  • Nach der Verbindung werden die Daten über Bluetooth MAP vom Smartphone ins Auto übertragen.
  • Nach der Trennung werden die Daten für dieses Smartphone aus der Datenbank des Autos gelöscht.

Car Messenger herunterladen

Holen Sie sich den neuesten Car Messenger-Commit aus Google Git.

APIs für die Sprachinteraktion

Car Messenger verwendet CarVoiceInteractionSession APIs, um sich in den Assistant einzubinden. Diese Elemente werden in den folgenden Abschnitten beschrieben.

PendingIntent-Modell

Diese APIs verwenden PendingIntent, um beantwortete Assistant-Anfragen an Car Messenger zurückzugeben.

So sieht die Abfolge der Ereignisse aus:

  1. Car Messenger startet den Assistant, indem activity.showAssist(Bundle args) angerufen wird. Die args enthalten die API-Aktion und ihre erforderlichen Parameter, einschließlich einer ausstehenden Absicht, falls erforderlich.

  2. Assistant ruft bei Bedarf Nutzereingaben ab und fügt sie der ausstehenden Absicht hinzu.

  3. Assistant sendet die Intent zurück an Car Messenger.

  4. Car Messenger löst die API-Aktion.

API-Aktion „Als gelesen markieren“

Wenn Assistant eine Nachricht vorliest, wird PendingIntent mit der Aktion VOICE_ACTION_READ_NOTIFICATION oder VOICE_ACTION_READ_CONVERSATION an Car Messenger gesendet, um die Nachricht als gelesen zu markieren.

API-Aktion „Direkte Antwort“

Wenn Assistant auf eine Nachricht antwortet, wird PendingIntent mit der Aktion VOICE_ACTION_REPLY_NOTIFICATION und VOICE_ACTION_REPLY_CONVERSATION an Car Messenger gesendet, um auf die Unterhaltung zu antworten.

API-Aktion „Direkt SMS senden“

Ein Bundle mit der Aktion VOICE_ACTION_SEND_SMS wird von Car Messenger an den Assistant gesendet.

Beispielcode:

/**
 *   KEY_PHONE_NUMBER - Recipient’s phone number. If this and the recipients name are not
 *   provided by the application, assistant must do contact disambiguation but is not required
 *   to add the name to the PendingIntent.
 *
 *   KEY_RECIPIENT_NAME - Recipient’s name. If this and the recipient phone number are not
 *   provided by the application, assistant must do contact disambiguation but is not required
 *   to add the name to the PendingIntent.
 *
 *   KEY_RECIPIENT_UID - Recipient’s UID in the ContactProvider database. Optionally provided
 *   by the application. Not required to be sent back by the assistant.
 *
 *   KEY_DEVICE_NAME - Friendly name of the device in which to send the message from. If not
 *   provided by the application, assistant must do device disambiguation but is not required
 *   to add it to PendingIntent. In V1 this is required to be sent by the application.
 *
 *   KEY_DEVICE_ADDRESS - Bluetooth device address of the device in which to send the message
 *   from. If not provided by the application, assistant must do device disambiguation and add
 *   this to the PendingIntent. In V1 this is required to be sent by the application.
 *
 *   KEY_SEND_PENDING_INTENT - @NotNull Will always be provided by the application. The
 *   application must preload the pending intent with any KEYs it provides the assistant that
 *   is also needed to send the message. (I.e if the application passes in the
 *   KEY_PHONE_NUMBER in the Bundle, the assistant can assume the application has already put
 *   this in the PendingIntent and may not re-add it to the PendingIntent).
 *
 */
public static final String KEY_PHONE_NUMBER = “KEY_PHONE_NUMBER”;
public static final String KEY_RECIPIENT_NAME = “KEY_RECIPIENT_NAME”;
public static final String KEY_RECIPIENT_UID = “KEY_RECIPIENT_UID”;
public static final String KEY_DEVICE_NAME = “KEY_DEVICE_NAME”;
public static final String KEY_DEVICE_ADDRESS = “KEY_DEVICE_NAME”;
public static final String KEY_SEND_PENDING_INTENT =”KEY_SEND_PENDING_INTENT”;

Auf diesem Bild ist zu sehen, wie eine Nachricht verfasst wird, wenn ein Empfänger ausgewählt ist:

Seite „Kontakte“ in der Telefon App Abbildung 3 Seite „Kontakte“ in der Telefon App

Auf diesem Bild ist zu sehen, wie eine Nachricht verfasst wird, wenn kein Empfänger über Neue Nachricht ausgewählt wurde:

Kein Empfänger ausgewählt Abbildung 4 Schaltfläche „Neue Nachricht“ in der Messenger App

Aktion „Direkt SMS senden“ einbinden

Hier ein Beispiel für einen Telefon-App-Dialer, in dem VOICE_ACTION_SEND_SMS eingebunden ist und optionale Parameter angegeben werden:

    /**
     * Build the {@link Bundle} to pass to assistant to send a sms.
     */
    public Bundle buildDirectSendBundle(String number, String name, String uid,
                                        BluetoothDevice device) {
        Bundle bundle = new Bundle();
        bundle.putString(CarVoiceInteractionSession.KEY_ACTION, VOICE_ACTION_SEND_SMS);
        // start optional parameters
        bundle.putString(CarVoiceInteractionSession.KEY_PHONE_NUMBER, number);
        bundle.putString(CarVoiceInteractionSession.KEY_RECIPIENT_NAME, name);
        bundle.putString(CarVoiceInteractionSession.KEY_RECIPIENT_UID, uid);
        // end optional parameters
        bundle.putString(CarVoiceInteractionSession.KEY_DEVICE_ADDRESS, device.getAddress());
        bundle.putString(CarVoiceInteractionSession.KEY_DEVICE_NAME,
                DialerUtils.getDeviceName(mContext, device));
        Intent intent = new Intent(mContext, MessagingService.class)
                .setAction(ACTION_DIRECT_SEND)
                .setClass(mContext, MessagingService.class);

        int requestCode = ACTION_DIRECT_SEND.hashCode();
        PendingIntent pendingIntent = PendingIntent.getForegroundService(
                mContext, requestCode, intent,
                PendingIntent.FLAG_ONE_SHOT | PendingIntent.FLAG_IMMUTABLE);

        bundle.putParcelable(KEY_SEND_PENDING_INTENT, pendingIntent);
        return bundle;
    }

Verbesserungen bei der TTR und der direkten Antwort

Die aktualisierte API verwendet jetzt eine vielseitige Conversation-Klasse, die Vorgänge über den Benachrichtigungsbereich hinaus ermöglicht und die Funktionen im Kontext der App erweitert. Damit entfällt die bisherige Anforderung, die Klasse StatusBarNotification zu verwenden.

Car Messenger debuggen

In den folgenden Abschnitten finden Sie weitere Informationen zum Beheben von Problemen mit Car Messenger.

Bluetooth-Verbindungen beheben

  1. Führen Sie den Befehl dumpsys aus:

    adb shell dumpsys bluetooth_manager
    
    • Suchen Sie in der Ausgabe des Befehls „dumpsys“ nach MapClientService.
     Profile: MapClientService
          mCurrentDevice: 99:99 (Pixel XL) name=Mce state=Connected
    
  2. Prüfen Sie, ob das richtige Gerät aufgeführt ist. Beispiel:

    Geräteliste Abbildung 5 Geräteliste

  3. Wenn kein Gerät gefunden wird, gehen Sie auf eine der folgenden Arten vor:

    • Stellen Sie eine Verbindung zu Bluetooth her.

    OR

    • Prüfen Sie in den Bluetooth-Einstellungen,ob SMS aktiviert ist.

    OR

    • Prüfen Sie auf dem Smartphone, ob der Zugriff auf Nachrichten gewährt wurde.

Bluetooth-Datenbanken debuggen

Car Messenger basiert auf der Telefoniedatenbank. Mit den Befehlen in der Tabelle können Sie feststellen, ob diese Datenbank über Bluetooth gefüllt wird.

Aufgabe Befehl
Unterhaltung adb shell content query--uri content://mms-sms/conversations?simple=true
Nur SMS adb shell content query--uri content://sms
MMS/SMS adb shell content query--uri content://mms-sms/conversations
Nur MMS adb shell content query--uri content://mms
Nur MMS-Posteingang adb shell content query--uri content://mms/conversations/inbox
Nur gesendete SMS adb shell content query--uri content://sms/sent
Nur SMS-Posteingang adb shell content query--uri content://sms/conversations/inbox
MMS-Nachricht – Teil 1
(ersetzen Sie 1 durch die ID der MMS)
adb shell content query--uri content://mms/part/1

Abfragen von Car Messenger und Sprachassistenten debuggen

Protokolle werden standardmäßig gedruckt, wenn das Build-Image eng oder userdebug ist. So aktivieren Sie das Logging für Car Messenger:

  1. Für die relevanten Tags adb shell setprop log.tag.<TAG> DEBUG ausführen

  2. Aktivieren Sie die Protokollierung für vorinstallierten Assistant.

  3. Bei leicht reproduzierbaren Fehlern können Sie in Android Studio Haltestellen verwenden.