Auto Messenger

Car Messenger ofrece funciones de mensajería diseñadas para dispositivos de automóviles. Al igual que otras apps para vehículos, los usuarios inician Car Messenger desde el selector.

Novedades de 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.
  • Consulta los mensajes recibidos antes y durante un viaje.
  • Escucha y responde mensajes.
  • Silenciar notificaciones de mensajes.
  • Inicia nuevas conversaciones.

Terminología

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

Presionar para leer (TTR)
La función Tocar para leer permite que los asistentes de voz lean y respondan mensajes de texto en nombre de a ese usuario cuando interactúe con notificaciones de mensajes.

Respuesta directa
Similar a Presionar para leer, excepto que el asistente de voz no lee en voz alta y solicita una respuesta de inmediato.

Envío directo
Se integra con un asistente de voz para redactar un nuevo mensaje. flujo con o sin un contacto especificado.

Beneficios de las apps sin agrupar

Las apps sin agrupar, como Car Messenger, ofrecen las siguientes ventajas:

  • Solo usa métodos públicos (no depende de plataformas en APIs ocultas).
  • Cómo desarrollar apps fuera de la plataforma de Android
  • Habilitar lanzamientos más frecuentes (para funciones nuevas y problemas corregidos)
  • Cómo actualizar apps desde Google Play

Obtén más información sobre las apps sin empaquetar.

Detalles técnicos

En esta sección, se describe la arquitectura de Car Messenger. Para obtener más información, consulta Integra con CarVoiceInteractionSession.

Arquitectura basada en telefonía

Cuando se vincula por Bluetooth, los datos se sincronizan desde la telefonía del teléfono a la base de datos de telefonía del vehículo. Al desconectarse de Bluetooth, los datos sincronizados se borran del la base de datos de telefonía.

Esta función se introdujo en Android 12. El los principales beneficios incluyen:

  • Los mensajes masivos de los usuarios se pueden recuperar a partir de una base de datos.
  • Se admiten mensajes de unidades anteriores.
  • Usa una arquitectura y una API similares para el almacenamiento y la recuperación de SMS en Android. teléfonos.
  • Se desagrupa por completo de la plataforma de Android.

Este es 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.
  • Durante la conexión, los datos se transfieren del teléfono al automóvil mediante Bluetooth MAP.
  • Al desconectarse, los datos del teléfono se borran de la base de datos del vehículo.

Obtener Car Messenger

Obtén la confirmación más reciente de Car Messenger desde Google Git.

APIs de interacción de voz

Car Messenger usa las APIs de CarVoiceInteractionSession para integrarse con la como un asistente de apps. Estos elementos se describen en las siguientes secciones.

Modelo de PendingIntent

Estas APIs usan PendingIntent para pasar las consultas resueltas del asistente a Auto Messenger.

Esta es la secuencia de eventos:

  1. 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.

  2. Si es necesario, el Asistente recupera las entradas del usuario y las empaqueta con el intent pendiente.

  3. Asistente devuelve el intent a Car Messenger.

  4. Car Messenger resuelve la acción de la API.

Acción de la API de Marcar como leído

Cuando Asistente lee un mensaje, se envía PendingIntent al vehículo 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 respuesta directa

Cuando Asistente responde un mensaje, se envía PendingIntent al vehículo Messenger con la acción VOICE_ACTION_REPLY_NOTIFICATION y VOICE_ACTION_REPLY_CONVERSATION para responder a la conversación.

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

Se envía un paquete con la acción VOICE_ACTION_SEND_SMS de Car Messenger al como un asistente de apps.

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 la redacción de un mensaje cuando se selecciona un destinatario:

Página de contactos de la app de Teléfono Figura 3: Página de contactos de la app de Teléfono

En esta imagen, se muestra la redacción de un mensaje cuando no se selecciona ningún destinatario con Mensaje nuevo:

No se seleccionó ningún destinatario Figura 4: Botón Mensaje nuevo en la app de Messenger.

Cómo integrar la acción de SMS de envío directo

A continuación, se incluye un ejemplo de que el Teléfono integra VOICE_ACTION_SEND_SMS y brinda opciones parámetros:

    /**
     * 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 para TTR y respuesta directa

La API actualizada ahora usa una clase Conversation versátil, permitir operaciones más allá del ámbito de la notificación y extender las capacidades dentro del contexto de la app. Esto reemplaza el requisito previo de usar Clase StatusBarNotification.

Cómo depurar Car Messenger

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

Cómo depurar conexiones Bluetooth

  1. 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
    
  2. Confirma que se muestre el dispositivo correcto. Por ejemplo:

    Lista de dispositivos Figura 5: Lista de dispositivos

  3. Si no se encuentra ningún dispositivo, realiza una de las siguientes acciones:

    • Vuelve a conectarte a Bluetooth.

    OR

    • En la Configuración de Bluetooth,confirma que la opción Mensaje de texto esté activada.

    OR

    • En el teléfono, confirma que hayas otorgado Acceso a mensajes.

Cómo depurar bases de datos de Bluetooth

Car Messenger se basa en la base de datos de telefonía. Para determinar si el Bluetooth está cuando completas esa base de datos, puedes usar los comandos en 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
MMS y 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 la 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 en Car Messenger y el 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, haz lo siguiente:

  1. Ejecuta la app para las etiquetas relevantes adb shell setprop log.tag.<TAG> DEBUG.

  2. Habilita el registro para Asistente precargado.

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