Car Messenger

Car Messenger bietet Messaging-Funktionen, die für Automotive-Geräte entwickelt wurden. Wie bei anderen Auto-Apps starten Nutzer Car Messenger über den Launcher.

Neues 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.
  • Nachrichten ansehen, 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 Vorlesen tippen
Mit „Tap-to-Read“ können Sprachassistenten Textnachrichten im Namen des Nutzers vorlesen und darauf antworten, wenn der Nutzer mit Benachrichtigungen zu Nachrichten interagiert.

Direktantwort
Ähnlich wie „Zum Vorlesen tippen“, aber der Sprachassistent liest die Nachricht nicht vor, sondern fordert sofort eine Antwort an.

Direct Send
Wird in einen Sprachassistenten eingebunden, um einen neuen Nachrichtenablauf mit oder ohne angegebenen Kontakt zu erstellen.

Vorteile von entbündelten Apps

Nicht gebündelte Apps wie Car Messenger bieten folgende Vorteile:

  • Es werden nur öffentliche Methoden verwendet (keine Plattformabhängigkeiten von verborgenen APIs).
  • Apps außerhalb der Android-Plattform entwickeln
  • Häufigere Releases für neue Funktionen und behobene Probleme ermöglichen
  • 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.

Telefoniebasierte Architektur

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

Diese Funktion wurde in Android 12 eingeführt. Die wichtigsten Vorteile sind:

  • Massenbenachrichtigungen 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 Funktion wird vollständig von der Android-Plattform entkoppelt.

So funktioniert es:

Telefoniebasierter Datenfluss Abbildung 1: Telefoniebasierter 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 in 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.
  • Wenn eine Verbindung hergestellt wird, werden die Daten über Bluetooth MAP vom Smartphone zum Auto übertragen.
  • Wenn die Verbindung getrennt wird, werden die Daten für dieses Smartphone aus der Datenbank des Autos gelöscht.

Car Messenger herunterladen

Laden Sie den neuesten Car Messenger-Commit von Google Git herunter.

APIs für Sprachinteraktionen

Car Messenger verwendet CarVoiceInteractionSession-APIs, um in den Assistant eingebunden zu werden. Diese Elemente werden in den folgenden Abschnitten beschrieben.

PendingIntent-Modell

Diese APIs verwenden PendingIntent, um aufgelöste Assistentenabfragen an Car Messenger zurückzugeben.

So läuft es ab:

  1. Car Messenger startet Assistant durch Aufrufen von activity.showAssist(Bundle args). Die Argumente enthalten die API-Aktion und die erforderlichen Parameter, bei Bedarf auch einen ausstehenden Intent.

  2. Assistant ruft bei Bedarf Nutzereingaben ab und verpackt sie mit dem ausstehenden Intent.

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

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

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.

Aktion der Direct Reply API

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 Konversation zu antworten.

SMS-API-Aktion „Direct Send“

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

Beispielcode:

/**
 *   KEY_PHONE_NUMBER - Recipients 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 - Recipients 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 - Recipients 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 ausgewählt ist. Dazu wird Neue Nachricht verwendet:

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

SMS-Aktion „Direkt senden“ einbinden

Hier finden Sie ein Beispiel für die Integration von VOICE_ACTION_SEND_SMS in die Dialer App mit optionalen Parametern:

    /**
     * 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 TTR und Direct Reply

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

Car Messenger debuggen

In den folgenden Abschnitten finden Sie weitere Informationen zum Debuggen von Car Messenger.

Bluetooth-Verbindungen debuggen

  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üfe, ob das richtige Gerät aufgeführt ist. Beispiel:

    Geräteliste Abbildung 5: Geräteliste

  3. Wenn kein Gerät gefunden wird, führen Sie einen der folgenden Schritte aus:

    • Stelle die Bluetooth-Verbindung wieder her.

    OR

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

    OR

    • Bestätigen Sie auf dem Smartphone, dass der Nachrichtenzugriff gewährt wird.

Bluetooth-Datenbanken debuggen

Car Messenger basiert auf der Telefoniedatenbank. Mit den Befehlen in der Tabelle können Sie prüfen, ob Bluetooth diese Datenbank füllt.

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

Car Messenger- und Sprachassistentenabfragen debuggen

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

  1. Führen Sie den Befehl für die relevanten Tags adb shell setprop log.tag.<TAG> DEBUG aus.

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

  3. Bei sehr reproduzierbaren Fehlern sollten Sie Breakpoints mit Android Studio verwenden.