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 na tela de início.

O que há de novo no Mensageiro do carro?

Com o novo app Car Messenger, os motoristas:

  • Tenha uma experiência dedicada a mensagens.
  • Inicie o Car Messenger no acesso rápido.
  • Procure mensagens recebidas antes e durante um percurso.
  • ouvir e responder a mensagens;
  • Silenciar notificações de mensagens.
  • Inicie novas conversas.

Terminologia

Estes termos são usados nesta página:

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

Resposta direta
Semelhante ao recurso "Toque para ler", exceto pelo assistente de voz, que não lê o texto em voz alta e envia uma solicitação de resposta imediatamente.

Envio direto
Integra-se a um assistente de voz para escrever uma nova mensagem fluxo com ou sem um contato especificado.

Benefícios de apps desagrupados

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

Detalhes técnicos

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

Arquitetura baseada em telefonia

Quando pareado por Bluetooth, os dados são sincronizados a partir da telefonia do telefone para o banco de dados de telefonia do carro. Após a desconexão do Bluetooth, os dados sincronizados serão excluídos do dispositivo no banco de dados de telefonia.

Esse recurso foi lançado no Android 12. A como:

  • 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 semelhantes para armazenamento e recuperação de SMS no Android celulares.
  • Fica totalmente desagrupado da plataforma Android.

Este é 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 app Messenger do carro 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.

Baixar o app Messenger

Receba o commit mais recente do Car Messenger do Google Git.

APIs de interação de voz

O Car Messenger usa APIs CarVoiceInteractionSession para se integrar ao como um assistente de chat. Esses elementos são descritos nas seções a seguir.

Modelo PendingIntent

Essas APIs usam PendingIntent para transmitir consultas resolvidas do assistente para Mensageiro de carros.

Esta é a sequência de eventos:

  1. O Car Messenger inicia o assistente chamando activity.showAssist(Bundle args). Os argumentos contêm a ação da API e seus parâmetros obrigatórios, contendo uma com intent pendente, se necessário.

  2. Se necessário, o Google Assistente recupera a entrada do usuário e a empacota com o com um intent pendente.

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

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

Marcar como ação de API de leitura

Quando o Google Assistente está lendo uma mensagem, o app PendingIntent é enviado para o carro 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 estiver respondendo a uma mensagem, o número PendingIntent será enviado para o carro 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 mensageiro do carro ao como um assistente de chat.

Exemplo de código:

/**
 *   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 imagem mostra como escrever 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 como escrever uma mensagem quando nenhum destinatário está selecionado usando o Nova mensagem:

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

Integrar a ação de envio direto de SMS

Confira um exemplo de como o Telefone integrando o VOICE_ACTION_SEND_SMS, oferecendo opções 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;
    }

Melhorias no TTR e na Resposta direta

A API atualizada agora usa uma classe Conversation versátil, permitindo operações além do âmbito da notificação e ampliando capacidades no contexto do app. Isso substitui o requisito anterior de usar o 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, siga uma das ações abaixo:

    • Reconecte-se ao Bluetooth.

    OU

    • Em Configurações de Bluetooth,confirme se a Mensagem de texto está ativada.

    OU

    • No telefone, 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á preencher o banco de dados, use os comandos da 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
Apenas caixa de entrada de SMS adb shell content query--uri content://sms/conversations/inbox
Mensagem MMS parte 1
(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 do 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 a geração de registros do Assistente pré-carregado.

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