Car Messenger offre des fonctionnalités de messagerie conçues pour les appareils automobiles. Comme les autres applications pour voitures, les utilisateurs lancent Car Messenger depuis le lanceur.
Nouveautés de Car Messenger
Avec la nouvelle application Car Messenger, les conducteurs peuvent :
- bénéficier d'une expérience de messagerie dédiée ;
- lancer Car Messenger depuis le lanceur ;
- parcourir les messages reçus avant et pendant un trajet ;
- écouter les messages et y répondre ;
- désactiver les notifications de message ;
- démarrer de nouvelles conversations.
Terminologie
Les termes suivants sont utilisés sur cette page :
Avantages des applications dissociées
Les applications dissociées, telles que Car Messenger, offrent les avantages suivants :
- Utilisation de méthodes publiques uniquement (aucune dépendance de plate-forme sur les API masquées)
- Développement d'applications en dehors de la plate-forme Android
- Publication plus fréquente (pour les nouvelles fonctionnalités et les problèmes résolus)
- Mise à jour des applications via Google Play
En savoir plus sur les applications dissociées.
Détails techniques
Cette section décrit l'architecture de Car Messenger. Pour en savoir plus, consultez Intégrer CarVoiceInteractionSession.
Architecture basée sur la téléphonie
Lorsqu'ils sont associés via Bluetooth, les données sont synchronisées de la base de données de téléphonie du téléphone vers celle de la voiture. Une fois la connexion Bluetooth interrompue, les données synchronisées sont supprimées de la base de données de téléphonie de la voiture.
Cette fonctionnalité a été introduite dans Android 12. Les principaux avantages sont les suivants :
- Les messages utilisateur groupés peuvent être récupérés à partir d'une base de données.
- Les messages des trajets précédents sont compatibles.
- Utilisation d'une architecture et d'une API semblables pour le stockage et la récupération des SMS sur les téléphones Android.
- Dissociation complète de la plate-forme Android.
Voici le flux :
Figure 1. Flux de données basé sur la téléphonie
Flux illustré au format texte :
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.
Voici ce que nous faisons avec les données :
Figure 2. Gestion des données de Car Messenger
Flux illustré au format texte :
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.
- Lors de la connexion, les données sont transférées du téléphone vers la voiture à l'aide de Bluetooth MAP.
- Lors de la déconnexion, les données de ce téléphone sont supprimées de la base de données de la voiture.
Obtenir Car Messenger
Obtenez le dernier Car Messenger commit à partir de Google Git.
API d'interaction vocale
Car Messenger utilise les API CarVoiceInteractionSession pour s'intégrer à l' Assistant. Ces éléments sont décrits dans les sections suivantes.
Modèle PendingIntent
Ces API utilisent PendingIntent pour renvoyer les requêtes d'assistant résolues à
Car Messenger.
Voici la séquence d'événements :
Car Messenger lance l'Assistant en appelant
activity.showAssist(Bundle args). Les arguments contiennent l'action de l'API et ses paramètres obligatoires, ainsi qu'un intent en attente si nécessaire.L'Assistant récupère l'entrée utilisateur si nécessaire et l'associe à l'intent en attente.
L'Assistant renvoie l'intent à Car Messenger.
Car Messenger résout l'action de l'API.
Action d'API "Marquer comme lu"
Lorsque l'Assistant lit un message, PendingIntent est envoyé à Car
Messenger avec l'action VOICE_ACTION_READ_NOTIFICATION ou
VOICE_ACTION_READ_CONVERSATION pour marquer le message comme lu.
Action d'API "Réponse directe"
Lorsque l'Assistant répond à un message, PendingIntent est envoyé à Car
Messenger avec l'action VOICE_ACTION_REPLY_NOTIFICATION et
VOICE_ACTION_REPLY_CONVERSATION pour répondre à la conversation.
Action d'API "Envoi direct de SMS"
Un bundle avec l'action VOICE_ACTION_SEND_SMS est envoyé de Car Messenger à l'
assistant.
Exemple de code :
/**
* 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”;
Cette image montre la composition d'un message lorsqu'un destinataire est sélectionné :
Figure 3. Page "Contacts" de l'application Téléphone
Cette image montre la composition d'un message lorsqu'aucun destinataire n'est sélectionné à l'aide de Nouveau message:
Figure 4. Bouton "Nouveau message" dans l'application Messenger
Intégrer l'action d'envoi direct de SMS
Voici un exemple d'intégration de VOICE_ACTION_SEND_SMS par l'application Téléphone, avec des paramètres facultatifs
:
/**
* 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;
}
Améliorations apportées à APR et à la réponse directe
L'API mise à jour utilise désormais une classe Conversation polyvalente,
qui permet d'effectuer des opérations au-delà du domaine des notifications et d'étendre les fonctionnalités
dans le contexte de l'application. Cela remplace l'exigence précédente d'utiliser la
StatusBarNotification classe.
Déboguer Car Messenger
Pour en savoir plus sur le débogage de Car Messenger, consultez les sections suivantes.
Déboguer les connexions Bluetooth
Exécutez la commande
dumpsys:adb shell dumpsys bluetooth_manager- Recherchez
MapClientServicedans le résultat de la commande dumpsys.
Profile: MapClientService mCurrentDevice: 99:99 (Pixel XL) name=Mce state=Connected- Recherchez
Vérifiez que l'appareil correct est listé. Exemple :
Figure 5. Liste des appareilsSi aucun appareil n'est trouvé, effectuez l'une des opérations suivantes :
- Reconnectez-vous au Bluetooth.
OU
- Dans Paramètres Bluetooth,vérifiez que l'option Message texte est activée.
OU
- Sur le téléphone, vérifiez que l'accès aux messages est autorisé.
Déboguer les bases de données Bluetooth
Car Messenger est basé sur la base de données de téléphonie. Pour déterminer si le Bluetooth remplit cette base de données, vous pouvez utiliser les commandes du tableau.
| Tâche | Commande |
|---|---|
| Conversation | adb shell content query --uri content://mms-sms/conversations?simple=true |
| Messages SMS uniquement | adb shell content query --uri content://sms |
| Messages MMS/SMS | adb shell content query --uri content://mms-sms/conversations |
| Messages MMS uniquement | adb shell content query --uri content://mms |
| Boîte de réception MMS uniquement | adb shell content query --uri content://mms/conversations/inbox |
| Messages SMS envoyés uniquement | adb shell content query --uri content://sms/sent |
| Boîte de réception SMS uniquement | adb shell content query --uri content://sms/conversations/inbox |
| Partie 1 du message MMS (remplacez 1 par l'ID du MMS) |
adb shell content query --uri content://mms/part/1 |
Déboguer Car Messenger et les requêtes d'assistant vocal
Les journaux s'impriment par défaut si l'image de compilation est eng ou userdebug.
Sinon, pour activer la journalisation de Car Messenger :
Exécutez pour les tags pertinents
adb shell setprop log.tag.<TAG> DEBUG.Activez la journalisation pour l'Assistant préchargé.
Pour les bugs très reproductibles, envisagez d'utiliser des points d'arrêt avec Android Studio.