Komunikator samochodowy

Czat samochodowy oferuje funkcje przesyłania wiadomości zaprojektowane z myślą o urządzeniach motoryzacyjnych. Podobnie jak w przypadku innych aplikacji samochodowych użytkownicy uruchamiają komunikator samochodowy z programu uruchamiającego.

Co nowego w Car Messenger?

W nowej aplikacji Car Messenger:

  • Korzystaj ze specjalnych funkcji przesyłania wiadomości.
  • Uruchom aplikację Car Messenger z programu uruchamiającego.
  • Przejrzyj wiadomości odebrane przed przejazdem i w jego trakcie.
  • Odsłuchiwanie wiadomości i odpowiadanie na nie.
  • Ignoruj powiadomienia o wiadomościach.
  • Rozpocznij nowe rozmowy.

Terminologia

Na tej stronie występują następujące terminy:

Dotknij, by przeczytać (TTR)
Funkcja Dotknij, by przeczytać umożliwia asystentom głosowym czytanie i odpowiadanie SMS-y w imieniu w przypadku interakcji użytkownika z powiadomieniami o wiadomościach.

Bezpośrednia odpowiedź
Podobne do Dotknij, by przeczytać, z tą różnicą, że asystent głosowy nie czyta na głos i od razu wysyła prośbę o odpowiedź.

Wysyłanie bezpośrednie
Integruje się z asystentem głosowym, aby utworzyć nową wiadomość mogą odbywać się z określonym kontaktem lub bez niego.

Zalety niepołączonych aplikacji

Aplikacje niepołączone z pakietem, np. Messenger, mają te zalety:

  • Wykorzystuje tylko metody publiczne (bez zależności platformy od ukrytych interfejsów API)
  • Tworzenie aplikacji poza platformą Androida
  • Włącz częstsze publikowanie wersji (na potrzeby nowych funkcji i rozwiązanych problemów)
  • Aktualizowanie aplikacji przez Google Play

Dowiedz się więcej o nieobsługiwanych aplikacjach.

Szczegóły techniczne

W tej sekcji opisano architekturę aplikacji samochodowej. Więcej informacji: Integracja z CarVoiceInteractionSession

Architektura oparta na telefonach

Po sparowaniu przez Bluetooth dane są synchronizowane z usługą telefoniczną telefonu do bazy danych telefonicznych samochodu. Po rozłączeniu Bluetootha zsynchronizowane dane są usuwane z samochodu bazy danych telefonicznych.

Ta funkcja została wprowadzona w Androidzie 12. to między innymi:

  • Zbiorcze wiadomości dla użytkowników można pobierać z bazy danych.
  • Wiadomości z poprzednich przejazdów są obsługiwane.
  • korzysta z podobnej architektury i interfejsu API do przechowywania i odbierania SMS-ów na Androidzie. telefonów.
  • zostanie w pełni odłączona od platformy Androida.

Proces ten wygląda tak:

Przepływ danych związany z telefonami Rysunek 1. Przepływ danych w ramach usług telefonicznych.

Schemat ilustrowany 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.

Co robimy z tymi danymi:

Użycie danych w aplikacji Car Messenger Rysunek 2. Obsługa danych z komunikatora samochodowego.

Schemat ilustrowany 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 przez Bluetooth MAP.
  • Po rozłączeniu dane tego telefonu są usuwane z bazy danych samochodu.

Pobierz komunikator samochodowy

Pobierz najnowsze zatwierdzenie aplikacji Car Messenger z Google Git.

Interfejsy API do interakcji głosowych

Aplikacja Car Messenger wykorzystuje interfejsy API CarVoiceInteractionSession do integracji za pomocą Asystenta. Opisy tych elementów znajdują się w sekcjach poniżej.

Model intencji PendingIntent

Te interfejsy API używają interfejsu PendingIntent, aby przekazywać rozwiązane zapytania Asystenta z powrotem do Komunikator samochodowy.

Oto kolejność zdarzeń:

  1. Czat samochodowy uruchamia asystenta, dzwoniąc pod numer activity.showAssist(Bundle args). Argumenty zawierają działanie interfejsu API i jego wymagane parametry, zawierające parametr intencję oczekującą.

  2. Asystent pobiera dane wejściowe użytkownika w razie potrzeby i tworzy pakiet, który intencję oczekującą.

  3. Asystent wysyła intencję z powrotem do aplikacji Car Messenger.

  4. Car Messenger rozwiązuje działanie interfejsu API.

Oznacz jako działanie interfejsu API do odczytu

Kiedy Asystent czyta wiadomość, aplikacja PendingIntent jest wysyłana do samochodu Messenger z akcją VOICE_ACTION_READ_NOTIFICATION lub VOICE_ACTION_READ_CONVERSATION, aby oznaczyć wiadomość jako przeczytaną.

Działanie interfejsu Direct Reply API

Kiedy Asystent odpowiada na wiadomość, komunikat PendingIntent jest wysyłany do samochodu Czat z akcją VOICE_ACTION_REPLY_NOTIFICATION i VOICE_ACTION_REPLY_CONVERSATION, aby odpowiedzieć w rozmowie.

Działanie interfejsu Direct Send SMS API

Pakiet z działaniem VOICE_ACTION_SEND_SMS jest wysyłany z komunikatora samochodowego do za pomocą 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:

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

Ten obraz przedstawia tworzenie wiadomości, gdy nie wybrano żadnego odbiorcy za pomocą Nowa wiadomość:

Nie wybrano odbiorcy Rysunek 4. Przycisk Nowa wiadomość w aplikacji Messenger.

Zintegruj bezpośrednie wysyłanie SMS-ów

Oto przykład integracji Telefonu VOICE_ACTION_SEND_SMS. Opcjonalnie możesz 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 uniwersalną klasę Conversation, co umożliwia wykonywanie operacji poza obszar powiadomień i rozszerzanie możliwości. w kontekście aplikacji. Zastępuje to wcześniejsze wymaganie stosowania StatusBarNotification zajęcia.

Debugowanie komunikatora samochodowego

Więcej informacji o debugowaniu aplikacji Car Messenger znajdziesz w kolejnych sekcjach.

Debugowanie połączeń Bluetooth

  1. Uruchom polecenie dumpsys:

    adb shell dumpsys bluetooth_manager
    
    • Wyszukaj MapClientService w danych wyjściowych polecenia dumpsys.
     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 urządzenie nie zostanie znalezione, wykonaj jedną z tych czynności:

    • Połącz ponownie z Bluetoothem.

    LUB

    • W Ustawieniach Bluetooth sprawdź,czy SMS-y są włączone.

    LUB

    • Na telefonie sprawdź, czy przyznano dostęp do wiadomości.

Debugowanie baz danych Bluetooth

Aplikacja Car Messenger opiera się na bazie danych telefonii. Aby określić, czy Bluetooth jest aby wypełniać tę bazę danych, możesz użyć poleceń z tej 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/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 adb shell content query--uri content://mms/conversations/inbox
Tylko SMS-y wysłane adb shell content query--uri content://sms/sent
Tylko odebrane SMS-y 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ń z komunikatora samochodowego i asystenta głosowego

Logi są domyślnie drukowane, jeśli obraz kompilacji ma rozmiar eng lub userdebug. Aby włączyć logowanie w aplikacji Car Messenger:

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

  2. Włącz logowanie wstępnie wczytanego Asystenta.

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