Car Messenger to aplikacja do przesyłania wiadomości zaprojektowana z myślą o urządzeniach samochodowych. Podobnie jak w przypadku innych aplikacji samochodowych użytkownicy uruchamiają Car Messenger z launchera.
Co nowego w Car Messenger?
Dzięki nowej aplikacji Car Messenger kierowcy:
- Korzystaj z dedykowanej aplikacji do obsługi wiadomości.
- Uruchom Car Messenger z menu z aplikacjami.
- Przeglądaj wiadomości odebrane przed przejazdem i w jego trakcie.
- słuchać wiadomości i na nie odpowiadać,
- wyciszyć powiadomienia o wiadomościach,
- rozpoczynać nowe rozmowy,
Terminologia
Na tej stronie używane są te terminy:
Zalety aplikacji bez powiązania
Aplikacje wydzielone, takie jak Car Messenger, mają te zalety:
- Korzysta tylko z metod publicznych (nie ma zależności od ukrytych interfejsów API platformy).
- Tworzenie aplikacji poza platformą Androida
- Umożliwia częstsze publikowanie wersji (z nowymi funkcjami i poprawionymi błędami).
- Aktualizowanie aplikacji w Google Play
Dowiedz się więcej o aplikacjach niepołączonych w pakiet.
Szczegóły techniczne
W tej sekcji opisujemy architekturę Car Messenger. Więcej informacji znajdziesz w artykule Integracja z CarVoiceInteractionSession.
Architektura oparta na telefonii
Po sparowaniu przez Bluetooth dane są synchronizowane z bazy danych telefonii w telefonie do bazy danych telefonii w samochodzie. Po rozłączeniu Bluetootha zsynchronizowane dane są usuwane z bazy danych telefonicznych samochodu.
Ta funkcja została wprowadzona w Androidzie 12. Główne zalety to:
- Wiadomości do wielu użytkowników można pobrać z bazy danych.
- Obsługiwane są wiadomości z poprzednich przejazdów.
- Wykorzystuje podobną architekturę i interfejs API do przechowywania i pobierania SMS-ów na telefonach z Androidem.
- zostanie całkowicie oddzielona od platformy Androida;
Proces wygląda tak:
Rysunek 1. Przepływ danych oparty na telefonii.
Przebieg 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 tymi danymi:
Rysunek 2. Obsługa danych w aplikacji Car Messenger.
Przebieg 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 połączeniu dane są przesyłane z telefonu do samochodu za pomocą profilu Bluetooth MAP.
- Po odłączeniu dane tego telefonu są usuwane z bazy danych samochodu.
Pobierz Car Messenger
Pobierz najnowszą wersję Car Messenger z Google Git.
Interfejsy API interakcji głosowych
Car Messenger korzysta z interfejsów CarVoiceInteractionSession, aby zintegrować się z asystentem. Te elementy są opisane w kolejnych sekcjach.
Model PendingIntent
Te interfejsy API używają metody PendingIntent
do przekazywania rozwiązanych zapytań do Asystenta z powrotem do komunikatora w samochodzie.
Sekwencja zdarzeń jest następująca:
Car Messenger uruchamia asystenta, dzwoniąc pod numer
activity.showAssist(Bundle args)
. Argumenty zawierają działanie interfejsu API i jego wymagane parametry, w tym w razie potrzeby oczekujące intencje.Asystent w razie potrzeby pobiera dane wejściowe użytkownika i pakuje je z oczekującą intencją.
Asystent odsyła intencję do komunikatora w samochodzie.
Car Messenger rozwiązuje działanie interfejsu API.
Działanie interfejsu API Oznacz jako przeczytane
Gdy Asystent odczytuje wiadomość, do komunikatora samochodowego wysyłany jest sygnał PendingIntent
z działaniem VOICE_ACTION_READ_NOTIFICATION
lub VOICE_ACTION_READ_CONVERSATION
, aby oznaczyć wiadomość jako przeczytaną.
Działanie interfejsu Direct Reply API
Gdy Asystent odpowiada na wiadomość, do komunikatora w samochodzie wysyłany jest znak PendingIntent
z działaniem VOICE_ACTION_REPLY_NOTIFICATION
i VOICE_ACTION_REPLY_CONVERSATION
, aby odpowiedzieć na rozmowę.
Działanie interfejsu Direct Send SMS API
Pakiet z działaniem VOICE_ACTION_SEND_SMS
jest wysyłany z Komunikatora samochodowego 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”;
Ilustracja przedstawia pisanie wiadomości po wybraniu odbiorcy:
Rysunek 3. Strona Kontakty w aplikacji Telefon.
Ilustracja przedstawiająca tworzenie wiadomości, gdy nie wybrano odbiorcy, za pomocą opcji Nowa wiadomość:
Rysunek 4. Przycisk Nowa wiadomość w aplikacji Messenger.
Integrowanie działania bezpośredniego wysyłania SMS-ów
Oto przykład integracji aplikacji Telefon z interfejsem VOICE_ACTION_SEND_SMS
z opcjonalnymi parametrami:
/**
* 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 dotyczące czasu do odpowiedzi i bezpośredniej odpowiedzi
Zaktualizowany interfejs API korzysta teraz z wszechstronnej klasy Conversation
, która umożliwia wykonywanie operacji wykraczających poza sferę powiadomień i rozszerza możliwości w kontekście aplikacji. Zastępuje to wcześniejszy wymóg używania klasy StatusBarNotification
.
Debugowanie Messengera w samochodzie
Więcej informacji o debugowaniu Car Messengera znajdziesz w sekcjach poniżej.
Debugowanie połączeń Bluetooth
Uruchom polecenie
dumpsys
:adb shell dumpsys bluetooth_manager
- W danych wyjściowych polecenia dumpsys wyszukaj znak
MapClientService
.
Profile: MapClientService mCurrentDevice: 99:99 (Pixel XL) name=Mce state=Connected
- W danych wyjściowych polecenia dumpsys wyszukaj znak
Sprawdź, czy na liście znajduje się właściwe urządzenie. Na przykład:
Rysunek 5. Lista urządzeń.
Jeśli nie znajdziesz urządzenia, wykonaj jedną z tych czynności:
- Połącz ponownie z Bluetooth.
LUB
- W ustawieniach Bluetooth sprawdź,czy opcja Wiadomość tekstowa jest włączona.
LUB
- Na telefonie potwierdź, że dostęp do wiadomości został przyznany.
Debugowanie baz danych Bluetooth
Car Messenger korzysta z bazy danych telefonicznych. Aby sprawdzić, czy Bluetooth wypełnia tę bazę danych, możesz użyć poleceń z tabeli.
Zadanie | Polecenie |
---|---|
Rozmowa | adb shell content query --uri content://mms-sms/conversations?simple=true |
Tylko SMS-y | adb shell content query --uri content://sms |
MMS-y i SMS-y | adb shell content query --uri content://mms-sms/conversations |
Tylko MMS-y | adb shell content query --uri content://mms |
Tylko skrzynka odbiorcza MMS-ów | adb shell content query --uri content://mms/conversations/inbox |
Wysłane tylko SMS-y | adb shell content query --uri content://sms/sent |
Tylko skrzynka odbiorcza SMS-ów | adb shell content query --uri content://sms/conversations/inbox |
MMS, część 1 (zastąp 1 identyfikatorem MMS-a) |
adb shell content query --uri content://mms/part/1 |
Debugowanie zapytań dotyczących komunikatora samochodowego i asystenta głosowego
Dzienniki są domyślnie rejestrowane, jeśli obraz kompilacji to eng
lub userdebug
.
Aby włączyć logowanie w przypadku komunikatora samochodowego:
Uruchom dla odpowiednich tagów
adb shell setprop log.tag.<TAG> DEBUG
.Włącz logowanie w przypadku wstępnie załadowanego Asystenta.
W przypadku błędów, które można łatwo odtworzyć, rozważ użycie punktów przerwania w Androidzie Studio.