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:
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:
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:
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:
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.Assistant ruft bei Bedarf Nutzereingaben ab und verpackt diese mit dem ausstehenden Intent.
Assistant sendet die Intent zurück an Car Messenger.
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 - 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 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 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
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
- Suchen Sie in der Ausgabe des dumpsys-Befehls 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 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:
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.