Mensajero del coche

Car Messenger ofrece capacidades de mensajería diseñadas para dispositivos automotrices. Al igual que otras aplicaciones para automóviles, los usuarios inician Car Messenger desde el iniciador.

¿Qué hay de nuevo en Car Messenger?

Con la nueva aplicación Car Messenger, los conductores:

  • Obtenga una experiencia de mensajería dedicada.
  • Inicie Car Messenger desde el iniciador.
  • Explore los mensajes recibidos antes y durante un viaje.
  • Escuchar y responder mensajes.
  • Silenciar notificaciones de mensajes.
  • Inicie nuevas conversaciones.

Terminología

Estos términos se utilizan en esta página:

Tocar para leer (TTR)
Tap-to-Read permite a los asistentes de voz leer y responder mensajes de texto en nombre de ese usuario, cuando el usuario interactúa con las notificaciones de mensajes.

Respuesta directa
Similar a Tap-to-Read, excepto que el asistente de voz no lee el mensaje e inmediatamente solicita una respuesta.

Envío directo
Se integra con un asistente de voz para redactar un nuevo flujo de mensajes con o sin un contacto específico.

Beneficios de las aplicaciones desagregadas

Las aplicaciones desagregadas, como Car Messenger, ofrecen estas ventajas:

  • Utiliza únicamente métodos públicos (sin dependencias de plataforma en API ocultas)
  • Desarrollar aplicaciones fuera de la plataforma Android
  • Habilite lanzamientos más frecuentes (para nuevas funciones y problemas solucionados)
  • Actualizar aplicaciones a través de Google Play

Obtenga más información sobre las aplicaciones desagregadas .

Detalles técnicos

Esta sección describe la arquitectura de Car Messenger. Para obtener más información, consulte Integración con CarVoiceInteractionSession .

Arquitectura basada en telefonía

Cuando se empareja a través de Bluetooth, los datos se sincronizan desde la base de datos de telefonía del teléfono con la base de datos de telefonía del automóvil. Al desconectarse el Bluetooth, los datos sincronizados se eliminan de la base de datos de telefonía del automóvil.

Esta capacidad se introdujo en Android 12. Los principales beneficios incluyen:

  • Los mensajes masivos de usuarios se pueden recuperar de una base de datos.
  • Se admiten mensajes de unidades anteriores.
  • Utiliza una arquitectura y API similares para el almacenamiento y recuperación de SMS en teléfonos Android.
  • Se desagrega completamente de la plataforma Android.

Aquí está el flujo:

Flujo de datos basado en telefonía Figura 1. Flujo de datos basado en 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:

Uso de datos de Car Messenger 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.
  • Al conectarse, los datos se transfieren del teléfono al automóvil mediante Bluetooth MAP.
  • Al desconectarse, los datos de ese teléfono se eliminan de la base de datos del automóvil.

Obtener Mensajero de Coche

Obtenga la última confirmación de Car Messenger de Google Git.

API de interacción de voz

Car Messenger utiliza las API CarVoiceInteractionSession para integrarse con el asistente. Estos elementos se describen en las siguientes secciones.

Modelo de intención pendiente

Estas API utilizan PendingIntent para pasar las consultas resueltas del asistente a Car Messenger.

Esta es la secuencia de eventos:

  1. Car Messenger inicia el asistente llamando activity.showAssist(Bundle args) . Los argumentos contienen la acción API y sus parámetros requeridos, y contienen una intención pendiente si es necesario.

  2. El asistente recupera la entrada del usuario si es necesario y la empaqueta con la intención pendiente.

  3. El Asistente envía la intención de regreso a Car Messenger.

  4. Car Messenger resuelve la acción API.

Marcar como acción API leída

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 API de respuesta directa

Cuando el asistente responde a un mensaje, PendingIntent se envía a Car Messenger con la acción VOICE_ACTION_REPLY_NOTIFICATION y VOICE_ACTION_REPLY_CONVERSATION para responder a la conversación.

Acción de API de envío directo de SMS

Se envía un paquete con la acción VOICE_ACTION_SEND_SMS desde 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”;

Esta imagen muestra cómo redactar un mensaje cuando se selecciona un destinatario:

Página de contactos de la aplicación Marcador Figura 3. Página de contactos en la aplicación Marcador.

Esta imagen muestra cómo redactar un mensaje cuando no se selecciona ningún destinatario usando Mensaje nuevo :

Ningún destinatario seleccionado Figura 4. Botón Nuevo mensaje en la aplicación Messenger.

Integrar la acción de envío directo de SMS

A continuación se muestra 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 TTR y respuesta directa

La API actualizada ahora utiliza una clase Conversation versátil, que permite operaciones más allá del ámbito de notificación y amplía las capacidades dentro del contexto de la aplicación. Esto reemplaza el requisito anterior de usar la clase StatusBarNotification .

Mensajero de depuración del coche

Consulte las siguientes secciones para obtener más información sobre la depuración de Car Messenger.

Depurar conexiones Bluetooth

  1. Ejecute el comando dumpsys :

    adb shell dumpsys bluetooth_manager
    
    • Busque MapClientService en la salida del comando dumpsys.
     Profile: MapClientService
          mCurrentDevice: 99:99 (Pixel XL) name=Mce state=Connected
    
  2. Confirme que el dispositivo correcto esté en la lista. Por ejemplo:

    Lista de dispositivos Figura 5. Lista de dispositivos.

  3. Si no se encuentra ningún dispositivo, haga lo siguiente :

    • Vuelva a conectarse a Bluetooth.

    O

    • En Configuración de Bluetooth, confirme que Mensaje de texto esté activado.

    O

    • En el teléfono, confirme que se haya otorgado acceso a mensajes .

Depurar bases de datos Bluetooth

Car Messenger se basa en la base de datos de telefonía. Para determinar si Bluetooth está completando esa base de datos, puede usar los comandos de la tabla.

Tarea Dominio
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/SMS adb shell content query--uri content://mms-sms/conversations
Sólo mensajes MMS adb shell content query--uri content://mms
Solo bandeja de entrada 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
Mensaje MMS parte 1
(reemplace 1 con el ID del MMS)
adb shell content query--uri content://mms/part/1

Depurar consultas de Car Messenger y 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 en Car Messenger:

  1. Ejecute para las etiquetas relevantes adb shell setprop log.tag.<TAG> DEBUG .

  2. Habilite el registro para el Asistente precargado .

  3. Para errores altamente reproducibles, considere usar puntos de interrupción con Android Studio .