Mensageiro de carros

O Car Messenger oferece recursos de mensagens projetados para dispositivos automotivos. Como outros apps para carros, os usuários iniciam o Car Messenger no Acesso rápido.

O que há de novo no Mensageiro do carro?

Com o novo app Car Messenger, os motoristas:

  • Tenha uma experiência de mensagens dedicada.
  • Inicie o Car Messenger no acesso rápido.
  • Procurar mensagens recebidas antes e durante uma viagem.
  • Ouvir e responder a mensagens.
  • Desativar as notificações de mensagens.
  • Iniciar novas conversas.

Terminologia

Estes termos são usados nesta página:

Toque para ler (TTR)
O recurso "Tocar para ler" permite que os assistentes de voz leiam e respondam a mensagens de texto em nome do usuário quando ele interagir com as notificações de mensagem.

Resposta direta
É semelhante ao recurso "Tocar para ler", exceto que o assistente de voz não lê a mensagem e emite imediatamente uma solicitação para uma resposta.

Envio direto
Integra-se a um assistente de voz para compor um novo fluxo de mensagens com ou sem um contato especificado.

Benefícios dos apps não agrupados

Os apps desagrupados, como o Car Messenger, oferecem estas vantagens:

  • Usa apenas métodos públicos (sem dependências de plataforma em APIs ocultas)
  • Desenvolver apps fora da plataforma Android
  • Ativar lançamentos mais frequentes (para novos recursos e problemas corrigidos)
  • Atualizar apps pelo Google Play

Saiba mais sobre apps desempacotados.

Detalhes técnicos

Esta seção descreve a arquitetura do Car Messenger. Para saber mais, consulte Integrar com CarVoiceInteractionSession (link em inglês).

Arquitetura baseada em telefonia

Quando pareado por Bluetooth, os dados são sincronizados do banco de dados de telefonia do smartphone com o do carro. Após a desconexão do Bluetooth, os dados sincronizados são excluídos do banco de dados de telefonia do carro.

Esse recurso foi lançado no Android 12. Os principais benefícios incluem:

  • As mensagens de usuários em massa podem ser recuperadas de um banco de dados.
  • É possível enviar mensagens de percursos anteriores.
  • Usa uma arquitetura e uma API semelhante para armazenamento e recuperação de SMS em smartphones Android.
  • Fica totalmente desagrupado da plataforma Android.

Confira o fluxo:

Fluxo de dados baseado em telefonia Figura 1. Fluxo de dados baseado em telefonia.

Fluxo ilustrado em 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.

Veja o que fazemos com os dados:

Uso de dados do Car Messenger Figura 2. Processamento de dados do Car Messenger.

Fluxo ilustrado em 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.
  • Ao conectar, os dados são transferidos do smartphone para o carro usando o Bluetooth MAP.
  • Ao desconectar, os dados desse smartphone serão excluídos do banco de dados do carro.

Instalar o Car Messenger

Receba a confirmação mais recente do Car Messenger do Google Git.

APIs de interação de voz

O Car Messenger usa APIs CarVoiceInteractionSession para integração com o assistente. Esses elementos são descritos nas seções a seguir.

Modelo PendingIntent

Essas APIs usam PendingIntent para transmitir consultas do assistente resolvidas de volta para o Car Messenger.

Esta é a sequência de eventos:

  1. O Car Messenger abre o Google Assistente chamando activity.showAssist(Bundle args). Os argumentos contêm a ação da API e os parâmetros necessários, contendo uma intent pendente, se necessário.

  2. O Google Assistente recupera a entrada do usuário, se necessário, e a empacota com a intent pendente.

  3. O Google Assistente envia a intent de volta para o Car Messenger.

  4. O Car Messenger resolve a ação da API.

Ação da API "Marcar como lida"

Quando o Google Assistente estiver lendo uma mensagem, PendingIntent será enviado ao Car Messenger com a ação VOICE_ACTION_READ_NOTIFICATION ou VOICE_ACTION_READ_CONVERSATION para marcar a mensagem como lida.

Ação da API Direct Reply

Quando o Google Assistente está respondendo a uma mensagem, PendingIntent é enviado ao Car Messenger com a ação VOICE_ACTION_REPLY_NOTIFICATION e VOICE_ACTION_REPLY_CONVERSATION para responder à conversa.

Ação da API Direct Send SMS

Um pacote com a ação VOICE_ACTION_SEND_SMS é enviado do Car Messenger para o assistente.

Exemplo de código:

/**
 *   KEY_PHONE_NUMBER - Recipients 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 - Recipients 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 - Recipients 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 imagem mostra a composição de uma mensagem quando um destinatário é selecionado:

Página de contatos do app Telefone Figura 3. Página de contatos no app Telefone.

Esta imagem mostra a criação de uma mensagem quando nenhum destinatário é selecionado usando Nova mensagem:

Nenhum destinatário selecionado Figura 4. Botão "Nova mensagem" no app Messenger.

Integrar a ação "Enviar SMS direto"

Confira um exemplo de discador que integra VOICE_ACTION_SEND_SMS, fornecendo parâmetros opcionais:

    /**
     * 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;
    }

Melhorias na TTR e na resposta direta

A API atualizada agora usa uma classe Conversation versátil, permitindo operações além do reino de notificações e ampliando recursos dentro do contexto do app. Isso substitui o requisito anterior de usar a classe StatusBarNotification.

Depurar mensageiro de carros

Consulte as seções a seguir para saber mais sobre a depuração do Car Messenger.

Depurar conexões Bluetooth

  1. Execute o comando dumpsys:

    adb shell dumpsys bluetooth_manager
    • Pesquise MapClientService na saída do comando dumpsys.
     Profile: MapClientService
          mCurrentDevice: 99:99 (Pixel XL) name=Mce state=Connected
    
  2. Confirme se o dispositivo correto está listado. Exemplo:

    Lista de dispositivos Figura 5. Lista de dispositivos.

  3. Se nenhum dispositivo for encontrado, faça uma das seguintes ações:

    • Conecte-se novamente ao Bluetooth.

    OU

    • Nas Configurações de Bluetooth,confirme se a opção Mensagem de texto está ativada.

    OU

    • No smartphone, confirme se o Acesso a mensagens foi concedido.

Depurar bancos de dados Bluetooth

O Car Messenger é criado com base no banco de dados de telefonia. Para determinar se o Bluetooth está preenchendo esse banco de dados, use os comandos na tabela.

Tarefa Comando
Conversa adb shell content query--uri content://mms-sms/conversations?simple=true
Somente mensagens SMS adb shell content query--uri content://sms
Mensagens MMS/SMS adb shell content query--uri content://mms-sms/conversations
Somente mensagens MMS adb shell content query--uri content://mms
Somente caixa de entrada de MMS adb shell content query--uri content://mms/conversations/inbox
Somente mensagens SMS enviadas adb shell content query--uri content://sms/sent
Somente caixa de entrada de SMS adb shell content query--uri content://sms/conversations/inbox
Parte 1 da mensagem MMS
(substitua 1 pelo ID do MMS)
adb shell content query--uri content://mms/part/1

Depurar consultas pelo assistente de voz e pelo mensageiro do carro

Os registros são impressos por padrão se a imagem de build for eng ou userdebug. Caso contrário, para ativar a geração de registros para o Car Messenger:

  1. Execute as tags relevantes adb shell setprop log.tag.<TAG> DEBUG.

  2. Ative o registro para o Google Assistente pré-carregado.

  3. Para bugs altamente reproduzíveis, use pontos de interrupção com o Android Studio.