Komunikator samochodowy

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:

Dotknij, aby przeczytać (TTR)
Funkcja „Kliknij, aby odczytać” umożliwia asystentom głosowym odczytywanie wiadomości tekstowych i odpowiadanie na nie w imieniu użytkownika, gdy ten wchodzi w interakcję z powiadomieniami o wiadomościach.

Bezpośrednia odpowiedź
Podobnie jak w przypadku funkcji „Kliknij, aby przeczytać”, z tym że asystent głosowy nie odczytuje wiadomości, tylko od razu wyświetla prośbę o odpowiedź.

Wysyłanie bezpośrednie
Integracja z asystentem głosowym w celu utworzenia nowej wiadomości z określonym kontaktem lub bez niego.

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:

Przepływ danych oparty na telefonii 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:

Wykorzystanie danych przez Car Messenger 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:

  1. 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.

  2. Asystent w razie potrzeby pobiera dane wejściowe użytkownika i pakuje je z oczekującą intencją.

  3. Asystent odsyła intencję do komunikatora w samochodzie.

  4. 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_NOTIFICATIONVOICE_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 - Recipients 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 - Recipients 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 - Recipients 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:

Strona Kontakty w aplikacji Telefon Rysunek 3. Strona Kontakty w aplikacji Telefon.

Ilustracja przedstawiająca tworzenie wiadomości, gdy nie wybrano odbiorcy, za pomocą opcji Nowa wiadomość:

Nie wybrano odbiorcy 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

  1. 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
    
  2. Sprawdź, czy na liście znajduje się właściwe urządzenie. Na przykład:

    Lista urządzeń Rysunek 5. Lista urządzeń.

  3. 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:

  1. Uruchom dla odpowiednich tagów adb shell setprop log.tag.<TAG> DEBUG.

  2. Włącz logowanie w przypadku wstępnie załadowanego Asystenta.

  3. W przypadku błędów, które można łatwo odtworzyć, rozważ użycie punktów przerwania w Androidzie Studio.