Posłaniec samochodowy

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:

Dotknij, aby przeczytać (TTR)
Funkcja „Dotknij, aby przeczytać” umożliwia asystentom głosowym czytanie i odpowiadanie na wiadomości tekstowe w imieniu tego użytkownika, gdy użytkownik wchodzi w interakcję z powiadomieniami o wiadomościach.

Odpowiedź bezpośrednia
Podobnie jak w przypadku funkcji „Dotknij, aby przeczytać”, z tą różnicą, że asystent głosowy nie odczytuje wiadomości i natychmiast wyświetla monit o odpowiedź.

Wysyłanie bezpośrednie
Integruje się z asystentem głosowym w celu tworzenia nowego przepływu wiadomości z określonym kontaktem lub bez niego.

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:

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

Wykorzystanie danych w aplikacji Car Messenger 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ń:

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

  2. W razie potrzeby Asystent pobiera dane wprowadzone przez użytkownika i pakuje je z oczekującą intencją.

  3. Asystent wysyła intencję z powrotem do komunikatora samochodowego.

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

Strona kontaktów aplikacji Dialer Rysunek 3. Strona Kontakty w aplikacji Dialer.

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

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

  1. 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
    
  2. Upewnij się, że 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 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:

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

  2. Włącz rejestrowanie dla Preloaded Assistant .

  3. W przypadku wysoce powtarzalnych błędów rozważ użycie punktów przerwania w Android Studio .