Car Messenger offre funzionalità di messaggistica progettate per i dispositivi automobilistici. Come altre app per auto, gli utenti avviano Car Messenger da Avvio app.
Novità di Car Messenger
Con la nuova app Car Messenger, i conducenti possono:
- Usufruire di un'esperienza di messaggistica dedicata.
- Avviare Car Messenger da Avvio app.
- Sfogliare i messaggi ricevuti prima e durante la guida.
- Ascoltare i messaggi e rispondere.
- Disattivare le notifiche dei messaggi.
- Iniziare nuove conversazioni.
Terminologia
Questi termini vengono utilizzati in questa pagina:
Vantaggi delle app non raggruppate
Le app non raggruppate, come Car Messenger, offrono i seguenti vantaggi:
- Utilizza solo metodi pubblici (nessuna dipendenza della piattaforma da API nascoste)
- Sviluppa app al di fuori della piattaforma Android
- Consente rilasci più frequenti (per nuove funzionalità e problemi risolti)
- Aggiorna le app tramite Google Play
Scopri di più sulle app non raggruppate.
Dettagli tecnici
Questa sezione descrive l'architettura di Car Messenger. Per scoprire di più, consulta la sezione Eseguire l'integrazione con CarVoiceInteractionSession.
Architettura basata sulla telefonia
Quando i dispositivi sono accoppiati tramite Bluetooth, i dati vengono sincronizzati dal database di telefonia dello smartphone al database di telefonia dell'auto. Quando il Bluetooth viene disconnesso, i dati sincronizzati vengono eliminati dal database di telefonia dell'auto.
Questa funzionalità è stata introdotta in Android 12. I vantaggi principali includono:
- È possibile recuperare i messaggi degli utenti collettivi da un database.
- Sono supportati i messaggi delle guide precedenti.
- Utilizza un'architettura e un'API simili per l'archiviazione e il recupero degli SMS sugli smartphone Android.
- Non è più raggruppata con la piattaforma Android.
Ecco il flusso:
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:
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 dallo smartphone all'auto tramite Bluetooth MAP.
- Al momento della disconnessione, i dati dello smartphone vengono eliminati dal database dell'auto.
Scarica Car Messenger
Scarica l'ultimo commit di Car Messenger da Google Git.
API di interazione vocale
Car Messenger utilizza le API CarVoiceInteractionSession per l'integrazione con l' assistente. Questi elementi sono descritti nelle sezioni seguenti.
Modello PendingIntent
Queste API utilizzano PendingIntent per restituire le query dell'assistente risolte a
Car Messenger.
Ecco la sequenza di eventi:
Car Messenger avvia l'assistente chiamando
activity.showAssist(Bundle args). Gli argomenti contengono l'azione API e i relativi parametri obbligatori, inclusa una Pending Intent, se necessario.L'assistente recupera l'input dell'utente, se necessario, e lo raggruppa con la Pending Intent.
L'assistente invia l'intent a Car Messenger.
Car Messenger risolve l'azione API.
Azione API Contrassegna come letto
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 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 di SMS
Un bundle con l'azione VOICE_ACTION_SEND_SMS viene inviato da Car Messenger all'
assistant.
Codice campione:
/**
* 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:
Figura 3. Pagina Contatti nell'app Telefono.
Questa immagine mostra la composizione di un messaggio quando non viene selezionato alcun destinatario utilizzando Nuovo messaggio:
Figura 4. Pulsante Nuovo messaggio nell'app Messaggi.
Integra l'azione di invio diretto di SMS
Ecco un esempio di Telefono 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 di TTR e Risposta diretta
L'API aggiornata ora utilizza una classe Conversation versatile,
che consente operazioni al di fuori dell'ambito delle notifiche ed estende le funzionalità
nel contesto dell'app. Questa sostituisce il requisito precedente di utilizzare la classe
StatusBarNotification.
Esegui il debug di Car Messenger
Per scoprire di più sul debug di Car Messenger, consulta le sezioni seguenti.
Esegui il debug delle connessioni Bluetooth
Esegui il comando
dumpsys:adb shell dumpsys bluetooth_manager- Cerca
MapClientServicenell'output del comando dumpsys.
Profile: MapClientService mCurrentDevice: 99:99 (Pixel XL) name=Mce state=Connected- Cerca
Verifica che sia elencato il dispositivo corretto. Ad esempio:
Figura 5. Elenco dei dispositivi.Se non viene trovato alcun dispositivo, esegui una delle seguenti operazioni:
- Riconnettiti al Bluetooth.
OPPURE
- In Impostazioni Bluetooth,verifica che l'opzione Messaggio di testo sia attiva.
OPPURE
- Sullo smartphone, verifica che sia stato concesso l'accesso ai messaggi.
Esegui il debug dei database Bluetooth
Car Messenger è basato sul database di telefonia. Per determinare se il Bluetooth sta compilando questo database, puoi utilizzare i comandi nella tabella.
| Attività | 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 Posta in arrivo MMS | adb shell content query --uri content://mms/conversations/inbox |
| Solo messaggi SMS inviati | adb shell content query --uri content://sms/sent |
| Solo Posta in arrivo SMS | adb shell content query --uri content://sms/conversations/inbox |
| Parte 1 del messaggio MMS (sostituisci 1 con l'ID dell'MMS) |
adb shell content query --uri content://mms/part/1 |
Esegui il debug di Car Messenger e delle query dell'assistente vocale
I log vengono stampati per impostazione predefinita se l'immagine della build è eng o userdebug.
In caso contrario, per abilitare il logging per Car Messenger:
Esegui per i tag pertinenti
adb shell setprop log.tag.<TAG> DEBUG.Abilita il logging per l'assistente precaricato.
Per i bug altamente riproducibili, valuta la possibilità di utilizzare i punti di interruzione con Android Studio.