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:

  • Nutzen Sie eine spezielle Nachrichtenfunktion.
  • 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

Diese Begriffe werden auf dieser Seite verwendet:

„Zum Lesen antippen“ (Tap-to-Read, TTR)
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 „Tap-to-Read“, mit dem Unterschied, dass der Sprachassistent die Nachricht nicht vorliest und sofort zu einer Antwort auffordert.

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.

Telefoniebasierte Architektur

Bei der Kopplung über Bluetooth werden Daten aus der Telefondatenbank des Smartphones mit der Telefondatenbank des Autos synchronisiert. Nachdem die Bluetooth-Verbindung getrennt wurde, 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.
  • Sie wird vollständig von der Android-Plattform entbündelt.

So funktioniert es:

Telefonbasierter Datenfluss Abbildung 1: Telefoniebasierter Datenfluss.

Darstellung des Ablaufs 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.
  • Wenn die Verbindung getrennt wird, 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 aufgelöste Assistant-Anfragen zurück an Car Messenger zu übergeben.

Das sind die Ereignisse:

  1. Car Messenger startet den Assistenten durch einen Anruf bei activity.showAssist(Bundle args). 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 verpackt diese mit dem ausstehenden Intent.

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

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

API-Aktion als gelesen markieren

Während Assistant eine Nachricht liest, 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.

Direct Reply API-Aktion

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 für Direct Send SMS

Ein Bundle mit der Aktion VOICE_ACTION_SEND_SMS wird von Car Messenger an den Assistant 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:

Kontaktseite der Telefon App Abbildung 3 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 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 TTR und Direktantwort

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

Weitere Informationen zum Beheben von Problemen mit Car Messenger finden Sie in den folgenden Abschnitten.

Bluetooth-Verbindungen beheben

  1. Führen Sie den Befehl dumpsys aus:

    adb shell dumpsys bluetooth_manager
    • Suchen Sie in der Ausgabe des dumpsys-Befehls 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 Nachrichtenzugriff 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 per SMS gesendete Nachrichten 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

Fehler bei Anfragen über Car Messenger und Sprachassistent beheben

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.