Car Messenger ofrece funciones de mensajería diseñadas para dispositivos automotrices. Al igual que con otras apps para vehículos, los usuarios inician Car Messenger desde el selector.
¿Qué novedades hay en Car Messenger?
Con la nueva app de Car Messenger, los conductores pueden hacer lo siguiente:
- Obtén una experiencia de mensajería exclusiva.
- Inicia Car Messenger desde el selector.
- Explora los mensajes recibidos antes y durante un viaje.
- Escuchar y responder mensajes
- Silenciar las notificaciones de mensajes
- Iniciar conversaciones nuevas
Terminología
En esta página, se usan los siguientes términos:
Beneficios de las apps sin paquetes
Las apps sin agrupar, como Car Messenger, ofrecen las siguientes ventajas:
- Solo usa métodos públicos (sin dependencias de plataforma en APIs ocultas)
- Desarrolla apps fuera de la plataforma de Android
- Habilita lanzamientos más frecuentes (para funciones nuevas y problemas corregidos)
- Cómo actualizar apps a través de Google Play
Obtén más información sobre las apps sin paquetes.
Detalles técnicos
En esta sección, se describe la arquitectura de Car Messenger. Para obtener más información, consulta Cómo realizar la integración con CarVoiceInteractionSession.
Arquitectura basada en telefonía
Cuando se vincula a través de Bluetooth, los datos se sincronizan desde la base de datos de telefonía del teléfono a la base de datos de telefonía del automóvil. Cuando se desconecta el Bluetooth, los datos sincronizados se borran de la base de datos de telefonía del automóvil.
Esta función se introdujo en Android 12. Los beneficios principales incluyen los siguientes:
- Los mensajes de los usuarios en forma masiva se pueden recuperar de una base de datos.
- Se admiten mensajes de viajes anteriores.
- Usa una arquitectura y una API similares para el almacenamiento y la recuperación de SMS en teléfonos Android.
- Se desvincula por completo de la plataforma de Android.
Este es el flujo:
Figura 1: Flujo de datos basado en la telefonía
Flujo ilustrado en formato de texto:
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.
Esto es lo que hacemos con los datos:
Figura 2: Manejo de datos de Car Messenger
Flujo ilustrado en formato de texto:
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.
- Cuando se establece la conexión, los datos se transfieren del teléfono al vehículo mediante Bluetooth MAP.
- Cuando se desconecta, los datos de ese teléfono se borran de la base de datos del automóvil.
Obtén Car Messenger
Obtén la confirmación más reciente de Car Messenger de Google Git.
APIs de interacción por voz
Car Messenger usa las APIs de CarVoiceInteractionSession para integrarse con el asistente. Estos elementos se describen en las siguientes secciones.
Modelo de PendingIntent
Estas APIs usan PendingIntent
para pasar las consultas resueltas del asistente a Car Messenger.
Esta es la secuencia de eventos:
Car Messenger inicia el asistente llamando a
activity.showAssist(Bundle args)
. Los argumentos contienen la acción de la API y sus parámetros obligatorios, que contienen un intent pendiente si es necesario.El Asistente recupera la entrada del usuario si es necesario y la empaqueta con el intent pendiente.
El Asistente vuelve a enviar el intent a Car Messenger.
Car Messenger resuelve la acción de la API.
Acción de la API de Mark as read
Cuando el Asistente lee un mensaje, se envía PendingIntent
a Car Messenger con la acción VOICE_ACTION_READ_NOTIFICATION
o VOICE_ACTION_READ_CONVERSATION
para marcar el mensaje como leído.
Acción de la API de Direct Reply
Cuando el Asistente responde un mensaje, PendingIntent
se envía a Car Messenger con la acción VOICE_ACTION_REPLY_NOTIFICATION
y VOICE_ACTION_REPLY_CONVERSATION
para responder la conversación.
Acción de la API de Send SMS directa
Se envía un paquete con la acción VOICE_ACTION_SEND_SMS
de Car Messenger al asistente.
Código de muestra:
/**
* 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”;
En esta imagen, se muestra cómo redactar un mensaje cuando se selecciona un destinatario:
Figura 3: Página de Contactos en la app de Teléfono.
En esta imagen, se muestra cómo redactar un mensaje cuando no se selecciona ningún destinatario con Nuevo mensaje:
Figura 4: Botón Nuevo mensaje en la app de Messenger.
Cómo integrar la acción de envío de SMS directo
Este es un ejemplo de Dialer que integra VOICE_ACTION_SEND_SMS
y proporciona parámetros opcionales:
/**
* 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;
}
Mejoras en la TTR y la respuesta directa
La API actualizada ahora usa una clase Conversation
versátil, que permite operaciones más allá del ámbito de las notificaciones y extiende las capacidades dentro del contexto de la app. Esto reemplaza el requisito anterior de usar la clase StatusBarNotification
.
Mensajero de depuración para vehículos
Consulta las siguientes secciones para obtener más información sobre la depuración de Car Messenger.
Cómo depurar conexiones Bluetooth
Ejecuta el comando
dumpsys
:adb shell dumpsys bluetooth_manager
- Busca
MapClientService
en el resultado del comando dumpsys.
Profile: MapClientService mCurrentDevice: 99:99 (Pixel XL) name=Mce state=Connected
- Busca
Confirma que aparezca el dispositivo correcto. Por ejemplo:
Figura 5: Lista de dispositivos.
Si no se encuentra ningún dispositivo, haz una de las siguientes acciones:
- Vuelve a conectarte a Bluetooth.
OR
- En Configuración de Bluetooth, confirma que la opción Mensaje de texto esté activada.
OR
- En el teléfono, confirma que se otorgó el Acceso a mensajes.
Cómo depurar bases de datos de Bluetooth
Car Messenger se compila en la base de datos de telefonía. Para determinar si Bluetooth está propagando esa base de datos, puedes usar los comandos de la tabla.
Tarea | Comando |
---|---|
Conversación | adb shell content query--uri content://mms-sms/conversations?simple=true |
Solo mensajes SMS | adb shell content query--uri content://sms |
Mensajes MMS o SMS | adb shell content query--uri content://mms-sms/conversations |
Solo mensajes MMS | adb shell content query--uri content://mms |
Solo la bandeja de entrada de MMS | adb shell content query--uri content://mms/conversations/inbox |
Solo mensajes SMS enviados | adb shell content query--uri content://sms/sent |
Solo bandeja de entrada de SMS | adb shell content query--uri content://sms/conversations/inbox |
Parte 1 del mensaje MMS (reemplaza 1 por el ID del MMS) |
adb shell content query--uri content://mms/part/1 |
Cómo depurar consultas de Car Messenger y del asistente de voz
Los registros se imprimen de forma predeterminada si la imagen de compilación es eng
o userdebug
.
De lo contrario, para habilitar el registro de Car Messenger, sigue estos pasos:
Ejecuta para las etiquetas relevantes
adb shell setprop log.tag.<TAG> DEBUG
.Habilita el registro para el Asistente precargado.
Para errores altamente reproducibles, considera usar puntos de interrupción con Android Studio.