Auto-Messenger

Car Messenger bietet Messaging-Funktionen für Automobilgeräte. Wie andere Auto-Apps starten Benutzer Car Messenger über den Launcher.

Was ist neu im Car Messenger?

Mit der neuen Car Messenger-App können Autofahrer:

  • Holen Sie sich ein spezielles Messaging-Erlebnis.
  • Starten Sie Car Messenger über den Launcher.
  • Durchsuchen Sie Nachrichten, die Sie vor und während einer Fahrt erhalten haben.
  • Nachrichten anhören und beantworten.
  • Nachrichtenbenachrichtigungen stummschalten.
  • Starten Sie neue Gespräche.

Terminologie

Auf dieser Seite werden folgende Begriffe verwendet:

Tap-to-Read (TTR)
Mit Tap-to-Read können Sprachassistenten Textnachrichten im Namen dieses Benutzers lesen und beantworten, wenn der Benutzer mit Nachrichtenbenachrichtigungen interagiert.

Direkte Antwort
Ähnlich wie Tap-to-Read, nur dass der Sprachassistent die Nachricht nicht vorliest und sofort zu einer Antwort auffordert.

Direktversand
Lässt sich mit einem Sprachassistenten integrieren, um einen neuen Nachrichtenfluss mit oder ohne angegebenen Kontakt zu erstellen.

Vorteile entbündelter Apps

Entbündelte Apps wie Car Messenger bieten folgende Vorteile:

  • Verwendet nur öffentliche Methoden (keine Plattformabhängigkeiten von versteckten APIs)
  • Entwickeln Sie Apps außerhalb der Android-Plattform
  • Aktivieren Sie häufigere Veröffentlichungen (für neue Funktionen und behobene Probleme).
  • Aktualisieren Sie Apps über Google Play

Erfahren Sie mehr über entbündelte Apps .

Technische Details

In diesem Abschnitt wird die Architektur von Car Messenger beschrieben. Weitere Informationen finden Sie unter „Integration mit CarVoiceInteractionSession“ .

Telefoniebasierte Architektur

Bei der Kopplung über Bluetooth werden die Daten von der Telefondatenbank des Telefons mit der Telefondatenbank des Fahrzeugs synchronisiert. Beim Trennen der Bluetooth-Verbindung werden die synchronisierten Daten aus der Telefondatenbank des Fahrzeugs gelöscht.

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

  • Massenbenutzernachrichten können aus einer Datenbank abgerufen werden.
  • Nachrichten von früheren Laufwerken werden unterstützt.
  • Verwendet eine ähnliche Architektur und API für die Speicherung und den Abruf von SMS auf Android-Telefonen.
  • Wird vollständig von der Android-Plattform entbündelt.

Hier ist der Ablauf:

Telefoniebasierter Datenfluss Abbildung 1. Telefonbasierter Datenfluss.

Ablauf im Textformat dargestellt:

 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 machen wir mit den Daten:

Datennutzung im Car Messenger Abbildung 2. Datenverarbeitung im Car Messenger.

Ablauf im Textformat dargestellt:

 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.
  • Bei der Verbindung werden die Daten über Bluetooth MAP vom Telefon zum Auto übertragen.
  • Beim Trennen der Verbindung werden die Daten für dieses Telefon aus der Datenbank des Fahrzeugs gelöscht.

Holen Sie sich Car Messenger

Holen Sie sich das neueste Car Messenger- Commit von Google Git.

Sprachinteraktions-APIs

Car Messenger verwendet CarVoiceInteractionSession- APIs zur Integration in den Assistenten. Diese Elemente werden in den folgenden Abschnitten beschrieben.

PendingIntent-Modell

Diese APIs verwenden PendingIntent um gelöste Assistentenanfragen an Car Messenger zurückzuleiten.

Dies ist der Ablauf der Ereignisse:

  1. Car Messenger startet den Assistenten durch Aufrufen activity.showAssist(Bundle args) . Die Argumente enthalten die API-Aktion und ihre erforderlichen Parameter sowie bei Bedarf eine ausstehende Absicht.

  2. Der Assistent ruft bei Bedarf Benutzereingaben ab und verpackt diese mit der ausstehenden Absicht.

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

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

Als gelesene API-Aktion markieren

Wenn der Assistent 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.

Direkte Antwort-API-Aktion

Wenn der Assistent auf eine Nachricht antwortet, wird PendingIntent mit den Aktionen VOICE_ACTION_REPLY_NOTIFICATION und VOICE_ACTION_REPLY_CONVERSATION an Car Messenger gesendet, um auf die Konversation zu antworten.

API-Aktion „Direktes Senden von SMS“.

Ein Bundle mit der Aktion VOICE_ACTION_SEND_SMS wird vom Car Messenger an den Assistenten 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”;

Dieses Bild zeigt das Verfassen einer Nachricht, wenn ein Empfänger ausgewählt ist:

Kontaktseite der Dialer-AppAbbildung 3. Seite „Kontakte“ in der Dialer-App.

Dieses Bild zeigt das Verfassen einer Nachricht, wenn über „Neue Nachricht“ kein Empfänger ausgewählt wurde:

Kein Empfänger ausgewähltAbbildung 4. Schaltfläche „Neue Nachricht“ in der Messenger-App.

Integrieren Sie die Aktion „Direktes Senden von SMS“.

Hier ist ein Beispiel dafür, wie Dialer VOICE_ACTION_SEND_SMS integriert und optionale Parameter bereitstellt:

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

Die aktualisierte API verwendet jetzt eine vielseitige Conversation Klasse, die Vorgänge über den Benachrichtigungsbereich hinaus ermöglicht und die Funktionen innerhalb des App-Kontexts erweitert. Dies ersetzt die vorherige Anforderung der Verwendung der StatusBarNotification Klasse.

Debuggen Sie den Car Messenger

Weitere Informationen zum Debuggen von Car Messenger finden Sie in den folgenden Abschnitten.

Debuggen Sie Bluetooth-Verbindungen

  1. Führen Sie den dumpsys Befehl 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. Vergewissern Sie sich, dass das richtige Gerät aufgeführt ist. Zum Beispiel:

    Geräteliste Abbildung 5. Geräteliste.

  3. Wenn kein Gerät gefunden wird, gehen Sie wie folgt vor :

    • Stellen Sie die Verbindung zu Bluetooth wieder her.

    ODER

    • Bestätigen Sie in den Bluetooth-Einstellungen, dass Textnachricht aktiviert ist.

    ODER

    • Bestätigen Sie am Telefon, dass der Nachrichtenzugriff gewährt wird.

Debuggen Sie Bluetooth-Datenbanken

Car Messenger basiert auf der Telefoniedatenbank. Um festzustellen, ob Bluetooth diese Datenbank füllt, können Sie die Befehle in der Tabelle verwenden.

Aufgabe Befehl
Gespräch adb shell content query--uri content://mms-sms/conversations?simple=true
Nur SMS-Nachrichten adb shell content query--uri content://sms
MMS/SMS-Nachrichten adb shell content query--uri content://mms-sms/conversations
Nur MMS-Nachrichten 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

Debuggen Sie Anfragen zu Car Messenger und Sprachassistenten

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

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

  2. Aktivieren Sie die Protokollierung für den vorinstallierten Assistenten .

  3. Erwägen Sie bei hochreproduzierbaren Fehlern die Verwendung von Haltepunkten mit Android Studio .