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:
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:
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:
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:
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.Assistant ruft bei Bedarf Nutzereingaben ab und fügt sie der ausstehenden Absicht hinzu.
Assistant sendet die Intent zurück an Car Messenger.
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:
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:
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
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
- Suchen Sie in der Ausgabe des Befehls „dumpsys“ nach
Prüfen Sie, ob das richtige Gerät aufgeführt ist. Beispiel:
Abbildung 5 Geräteliste
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:
Für die relevanten Tags
adb shell setprop log.tag.<TAG> DEBUG
ausführenAktivieren Sie die Protokollierung für vorinstallierten Assistant.
Bei leicht reproduzierbaren Fehlern können Sie in Android Studio Haltestellen verwenden.