Car Messenger oferuje funkcje przesyłania wiadomości przeznaczone dla urządzeń motoryzacyjnych. Podobnie jak inne aplikacje samochodowe, użytkownicy uruchamiają Car Messenger z poziomu programu uruchamiającego.
Co nowego w Car Messengerze?
Dzięki nowej aplikacji Car Messenger kierowcy:
- Skorzystaj z dedykowanej funkcji przesyłania wiadomości.
- Uruchom Car Messenger z poziomu programu uruchamiającego.
- Przeglądaj wiadomości otrzymane przed jazdą i w jej trakcie.
- Słuchaj i odpowiadaj na wiadomości.
- Wycisz powiadomienia o wiadomościach.
- Rozpocznij nowe rozmowy.
Terminologia
Na tej stronie używane są następujące terminy:
Korzyści z uwolnionych aplikacji
Rozdzielone aplikacje, takie jak Car Messenger, zapewniają następujące korzyści:
- Używa tylko metod publicznych (brak zależności platformy od ukrytych interfejsów API)
- Twórz aplikacje poza platformą Android
- Włącz częstsze wydania (w przypadku nowych funkcji i naprawionych problemów)
- Aktualizuj aplikacje poprzez Google Play
Dowiedz się więcej o uwolnionych aplikacjach .
Szczegóły techniczne
W tej sekcji opisano architekturę Car Messenger. Aby dowiedzieć się więcej, zobacz Integracja z CarVoiceInteractionSession .
Architektura oparta na telefonii
Po sparowaniu przez Bluetooth dane są synchronizowane z telefonicznej bazy danych telefonu z bazą danych telefonii w samochodzie. Po rozłączeniu Bluetooth zsynchronizowane dane zostaną usunięte z telefonicznej bazy danych samochodu.
Ta funkcja została wprowadzona w systemie Android 12. Do głównych korzyści należą:
- Z bazy danych można pobierać zbiorcze wiadomości użytkowników.
- Obsługiwane są wiadomości z poprzednich dysków.
- Wykorzystuje podobną architekturę i interfejs API do przechowywania i pobierania SMS-ów na telefonach z Androidem.
- Staje się w pełni oddzielony od platformy Android.
Oto przepływ:
Rysunek 1. Przepływ danych w oparciu o telefonię.
Przepływ zilustrowany w formacie tekstowym:
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.
Oto, co robimy z danymi:
Rysunek 2. Obsługa danych Car Messenger.
Przepływ zilustrowany w formacie tekstowym:
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.
- Po nawiązaniu połączenia dane są przesyłane z telefonu do samochodu za pomocą Bluetooth MAP.
- Po rozłączeniu dane tego telefonu zostaną usunięte z bazy danych samochodu.
Pobierz komunikator samochodowy
Pobierz najnowszą wersję komunikatu Car Messenger z Google Git.
Interfejsy API interakcji głosowych
Car Messenger do integracji z asystentem wykorzystuje API CarVoiceInteractionSession . Elementy te opisano w poniższych sekcjach.
Model PendingIntent
Te interfejsy API wykorzystują PendingIntent
do przekazywania rozwiązanych zapytań asystenta z powrotem do komunikatora samochodowego.
Oto sekwencja wydarzeń:
Car Messenger uruchamia asystenta , wywołując
activity.showAssist(Bundle args)
. Argumenty zawierają akcję API i jej wymagane parametry, w razie potrzeby zawierające oczekującą intencję.W razie potrzeby Asystent pobiera dane wprowadzone przez użytkownika i pakuje je z oczekującą intencją.
Asystent wysyła intencję z powrotem do komunikatora samochodowego.
Car Messenger rozwiązuje akcję API.
Oznacz jako przeczytaną akcję API
Gdy asystent czyta wiadomość, do komunikatora samochodowego wysyłana jest PendingIntent
z akcją VOICE_ACTION_READ_NOTIFICATION
lub VOICE_ACTION_READ_CONVERSATION
w celu oznaczenia wiadomości jako przeczytanej.
Akcja API bezpośredniej odpowiedzi
Gdy asystent odpowiada na wiadomość, do komunikatora samochodowego wysyłana jest PendingIntent
z akcją VOICE_ACTION_REPLY_NOTIFICATION
i VOICE_ACTION_REPLY_CONVERSATION
, aby odpowiedzieć na rozmowę.
Akcja API bezpośredniego wysyłania wiadomości SMS
Paczka z akcją VOICE_ACTION_SEND_SMS
zostaje wysłana z Car Messenger do asystenta.
Przykładowy kod:
/**
* 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”;
Ten obraz przedstawia tworzenie wiadomości po wybraniu odbiorcy:
Rysunek 3. Strona Kontakty w aplikacji Dialer.
Ten obraz przedstawia tworzenie wiadomości, gdy nie wybrano żadnego odbiorcy za pomocą opcji Nowa wiadomość :
Rysunek 4. Przycisk Nowa wiadomość w aplikacji Messenger.
Zintegruj akcję bezpośredniego wysyłania wiadomości SMS
Oto przykład Dialera integrującego VOICE_ACTION_SEND_SMS
, udostępniającego opcjonalne parametry:
/**
* 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;
}
Ulepszenia TTR i bezpośredniej odpowiedzi
Zaktualizowany interfejs API wykorzystuje teraz wszechstronną klasę Conversation
, umożliwiając operacje poza obszarem powiadomień i rozszerzając możliwości w kontekście aplikacji. Zastępuje to wcześniejsze wymaganie użycia klasy StatusBarNotification
.
Debuguj komunikator samochodowy
Zobacz poniższe sekcje, aby dowiedzieć się więcej o debugowaniu Car Messenger.
Debuguj połączenia Bluetooth
Uruchom polecenie
dumpsys
:adb shell dumpsys bluetooth_manager
- Wyszukaj
MapClientService
w wynikach komendy dumpsys.
Profile: MapClientService mCurrentDevice: 99:99 (Pixel XL) name=Mce state=Connected
- Wyszukaj
Upewnij się, że na liście znajduje się właściwe urządzenie. Na przykład:
Rysunek 5. Lista urządzeń.
Jeśli nie zostanie znalezione żadne urządzenie, wykonaj jedną z następujących czynności:
- Połącz się ponownie z Bluetooth.
LUB
- W Ustawieniach Bluetooth potwierdź, że Wiadomości tekstowe są włączone.
LUB
- Potwierdź przez telefon, że dostęp do wiadomości został przyznany.
Debuguj bazy danych Bluetooth
Car Messenger jest zbudowany w oparciu o bazę danych telefonii. Aby ustalić, czy Bluetooth zapełnia tę bazę danych, możesz użyć poleceń podanych w tabeli.
Zadanie | Komenda |
---|---|
Rozmowa | adb shell content query--uri content://mms-sms/conversations?simple=true |
Tylko wiadomości SMS | adb shell content query--uri content://sms |
Wiadomości MMS/SMS | adb shell content query--uri content://mms-sms/conversations |
Tylko wiadomości MMS | adb shell content query--uri content://mms |
Tylko skrzynka odbiorcza MMS | adb shell content query--uri content://mms/conversations/inbox |
Tylko wiadomości wysłane SMS-em | adb shell content query--uri content://sms/sent |
Tylko skrzynka odbiorcza SMS | adb shell content query--uri content://sms/conversations/inbox |
Wiadomość MMS część 1 (zamień 1 na identyfikator wiadomości MMS) | adb shell content query--uri content://mms/part/1 |
Debuguj zapytania w programie Car Messenger i asystentach głosowych
Dzienniki są drukowane domyślnie, jeśli obraz kompilacji to eng
lub userdebug
. W przeciwnym razie, aby włączyć logowanie dla Car Messenger:
Uruchom dla odpowiednich tagów
adb shell setprop log.tag.<TAG> DEBUG
.Włącz rejestrowanie dla Preloaded Assistant .
W przypadku wysoce powtarzalnych błędów rozważ użycie punktów przerwania w Android Studio .