Messaggero per auto

Car Messenger offre funzionalità di messaggistica progettate per i dispositivi automobilistici. Come altre app per auto, gli utenti avviano Car Messenger dal launcher.

Cosa c'è di nuovo in Car Messenger?

Con la nuova app Car Messenger gli automobilisti:

  • Ottieni un'esperienza di messaggistica dedicata.
  • Avvia Car Messenger dal launcher.
  • Sfoglia i messaggi ricevuti prima e durante un viaggio.
  • Ascolta e rispondi ai messaggi.
  • Disattiva le notifiche dei messaggi.
  • Inizia nuove conversazioni.

Terminologia

In questa pagina vengono utilizzati i seguenti termini:

Tocca per leggere (TTR)
Tap-to-Read consente agli assistenti vocali di leggere e rispondere ai messaggi di testo per conto di quell'utente, quando l'utente interagisce con le notifiche dei messaggi.

Risposta diretta
Simile a Tocca per leggere, tranne per il fatto che l'assistente vocale non legge il messaggio e richiede immediatamente una risposta.

Invio diretto
Si integra con un assistente vocale per comporre un nuovo flusso di messaggi con o senza un contatto specificato.

Vantaggi delle app disaggregate

Le app disaggregate, come Car Messenger, offrono questi vantaggi:

  • Utilizza solo metodi pubblici (nessuna dipendenza della piattaforma da API nascoste)
  • Sviluppa app al di fuori della piattaforma Android
  • Abilita rilasci più frequenti (per nuove funzionalità e problemi risolti)
  • Aggiorna le app tramite Google Play

Ulteriori informazioni sulle app disaggregate .

Dettagli tecnici

Questa sezione descrive l'architettura di Car Messenger. Per ulteriori informazioni, consulta Integrazione con CarVoiceInteractionSession .

Architettura basata sulla telefonia

Se accoppiato tramite Bluetooth, i dati vengono sincronizzati dal database della telefonia del telefono al database della telefonia dell'auto. Alla disconnessione del Bluetooth, i dati sincronizzati vengono cancellati dal database della telefonia dell'auto.

Questa funzionalità è stata introdotta in Android 12. I vantaggi principali includono:

  • I messaggi utente in blocco possono essere recuperati da un database.
  • Sono supportati i messaggi delle unità precedenti.
  • Utilizza un'architettura e un'API simili per l'archiviazione e il recupero degli SMS sui telefoni Android.
  • Diventa completamente separato dalla piattaforma Android.

Ecco il flusso:

Flusso di dati basato sulla telefonia Figura 1. Flusso di dati basato sulla telefonia.

Flusso illustrato in formato testo:

 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.

Ecco cosa facciamo con i dati:

Utilizzo dei dati di Car Messenger Figura 2. Gestione dei dati di Car Messenger.

Flusso illustrato in formato testo:

 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.
  • Al momento della connessione, i dati vengono trasferiti dal telefono all'auto tramite Bluetooth MAP.
  • Alla disconnessione, i dati di quel telefono vengono cancellati dal database dell'auto.

Ottieni Car Messenger

Ottieni l'ultimo commit di Car Messenger da Google Git.

API di interazione vocale

Car Messenger utilizza le API CarVoiceInteractionSession per integrarsi con l'assistente. Questi elementi sono descritti nelle sezioni seguenti.

Modello PendingIntent

Queste API utilizzano PendingIntent per trasferire le query dell'assistente risolte a Car Messenger.

Questa la sequenza degli eventi:

  1. Car Messenger avvia l'assistente chiamando activity.showAssist(Bundle args) . Gli argomenti contengono l'azione API e i relativi parametri richiesti, contenenti un intento in sospeso, se necessario.

  2. L'assistente recupera l'input dell'utente, se necessario, e lo assembla con l'intento in sospeso.

  3. L'assistente invia l'intento a Car Messenger.

  4. Car Messenger risolve l'azione API.

Contrassegna come azione API letta

Quando l'assistente legge un messaggio, PendingIntent viene inviato a Car Messenger con l'azione VOICE_ACTION_READ_NOTIFICATION o VOICE_ACTION_READ_CONVERSATION per contrassegnare il messaggio come letto.

Azione API di risposta diretta

Quando l'assistente risponde a un messaggio, PendingIntent viene inviato a Car Messenger con l'azione VOICE_ACTION_REPLY_NOTIFICATION e VOICE_ACTION_REPLY_CONVERSATION per rispondere alla conversazione.

Azione API Invio diretto SMS

Un pacchetto con l'azione VOICE_ACTION_SEND_SMS viene inviato da Car Messenger all'assistente.

Codice d'esempio:

/**
 *   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”;

Questa immagine mostra la composizione di un messaggio quando viene selezionato un destinatario:

Pagina Contatti dell'app Dialer Figura 3. Pagina Contatti nell'app Dialer.

Questa immagine mostra la composizione di un messaggio quando nessun destinatario è selezionato utilizzando Nuovo messaggio :

Nessun destinatario selezionato Figura 4. Pulsante Nuovo messaggio nell'app Messenger.

Integra l'azione di invio diretto di SMS

Ecco un esempio di Dialer che integra VOICE_ACTION_SEND_SMS , fornendo parametri facoltativi:

    /**
     * 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;
    }

Miglioramenti a TTR e risposta diretta

L'API aggiornata ora utilizza una classe Conversation versatile, consentendo operazioni oltre l'ambito delle notifiche ed estendendo le funzionalità all'interno del contesto dell'app. Ciò sostituisce il requisito precedente dell'utilizzo della classe StatusBarNotification .

Eseguire il debug di Car Messenger

Consulta le sezioni seguenti per ulteriori informazioni sul debug di Car Messenger.

Eseguire il debug delle connessioni Bluetooth

  1. Esegui il comando dumpsys :

    adb shell dumpsys bluetooth_manager
    
    • Cerca MapClientService nell'output del comando dumpsys.
     Profile: MapClientService
          mCurrentDevice: 99:99 (Pixel XL) name=Mce state=Connected
    
  2. Confermare che sia elencato il dispositivo corretto. Per esempio:

    Elenco dei dispositivi Figura 5. Elenco dei dispositivi.

  3. Se non viene trovato alcun dispositivo, effettuare una delle seguenti operazioni:

    • Riconnettiti al Bluetooth.

    O

    • Nelle Impostazioni Bluetooth, verifica che i messaggi di testo siano attivi.

    O

    • Sul telefono, conferma che l'accesso ai messaggi è concesso.

Eseguire il debug dei database Bluetooth

Car Messenger è basato sul database della telefonia. Per determinare se Bluetooth sta popolando quel database, puoi utilizzare i comandi nella tabella.

Compito Comando
Conversazione adb shell content query--uri content://mms-sms/conversations?simple=true
Solo messaggi SMS adb shell content query--uri content://sms
Messaggi MMS/SMS adb shell content query--uri content://mms-sms/conversations
Solo messaggi MMS adb shell content query--uri content://mms
Solo casella di posta MMS adb shell content query--uri content://mms/conversations/inbox
Solo messaggi inviati via SMS adb shell content query--uri content://sms/sent
Solo casella di posta SMS adb shell content query--uri content://sms/conversations/inbox
Messaggio MMS parte 1
(sostituire 1 con l'ID dell'MMS)
adb shell content query--uri content://mms/part/1

Esegui il debug delle query di Car Messenger e dell'assistente vocale

I log vengono stampati per impostazione predefinita se l'immagine di build è eng o userdebug . Altrimenti, per abilitare la registrazione per Car Messenger:

  1. Esegui per i tag pertinenti adb shell setprop log.tag.<TAG> DEBUG .

  2. Abilita la registrazione per l'Assistente precaricato .

  3. Per bug altamente riproducibili, valuta la possibilità di utilizzare punti di interruzione con Android Studio .