Mensageiro de carro

Car Messenger oferece recursos de mensagens projetados para dispositivos automotivos. Como outros aplicativos automotivos, os usuários iniciam o Car Messenger no inicializador.

O que há de novo no Car Messenger?

Com o novo aplicativo Car Messenger, os motoristas:

  • Obtenha uma experiência de mensagens dedicada.
  • Inicie o Car Messenger a partir do inicializador.
  • Procure mensagens recebidas antes e durante uma viagem.
  • Ouça e responda mensagens.
  • Silenciar notificações de mensagens.
  • Inicie novas conversas.

Terminologia

Estes termos são usados ​​nesta página:

Toque para ler (TTR)
Tap-to-Read permite que assistentes de voz leiam e respondam mensagens de texto em nome desse usuário, quando o usuário interage com notificações de mensagens.

Resposta Direta
Semelhante ao Tap-to-Read, exceto que o assistente de voz não lê a mensagem e emite imediatamente uma solicitação de resposta.

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

Benefícios de aplicativos desagregados

Aplicativos desagregados, como Car Messenger, oferecem estas vantagens:

  • Usa apenas métodos públicos (sem dependências de plataforma em APIs ocultas)
  • Desenvolva aplicativos fora da plataforma Android
  • Habilite lançamentos mais frequentes (para novos recursos e problemas corrigidos)
  • Atualize aplicativos através do Google Play

Saiba mais sobre aplicativos desagregados .

Detalhes técnicos

Esta seção descreve a arquitetura do Car Messenger. Para saber mais, consulte Integrar com CarVoiceInteractionSession .

Arquitetura baseada em telefonia

Quando emparelhado via Bluetooth, os dados são sincronizados do banco de dados de telefonia do telefone para o banco de dados de telefonia do carro. Ao desligar o Bluetooth, os dados sincronizados são eliminados da base de dados telefónica do automóvel.

Esse recurso foi introduzido no Android 12. Os principais benefícios incluem:

  • Mensagens de usuário em massa podem ser recuperadas de um banco de dados.
  • Mensagens de unidades anteriores são suportadas.
  • Usa uma arquitetura e API semelhantes para armazenamento e recuperação de SMS em telefones Android.
  • Torna-se totalmente desagregado da plataforma Android.

Aqui está 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.

Aqui está o que fazemos com os dados:

Uso de dados do Car Messenger Figura 2. Manipulação 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 telefone para o carro usando Bluetooth MAP.
  • Ao desconectar, os dados desse telefone são excluídos do banco de dados do carro.

Obtenha o Mensageiro do Carro

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

APIs de interação por voz

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 de assistente resolvidas de volta ao Car Messenger.

Esta é a sequência de eventos:

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

  2. O Assistant recupera a entrada do usuário, se necessário, e empacota-a com a intenção pendente.

  3. O Assistant envia a intenção de volta ao Car Messenger.

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

Marcar como lida a ação da API

Quando o assistente está lendo uma mensagem, PendingIntent é 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 de resposta direta

Quando o assistente está respondendo a uma mensagem, PendingIntent é enviado ao Car Messenger com as ações VOICE_ACTION_REPLY_NOTIFICATION e VOICE_ACTION_REPLY_CONVERSATION para responder à conversa.

Ação da API de envio direto de SMS

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

Código de amostra:

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

Página de contatos do aplicativo Dialer Figura 3. Página de contatos no aplicativo Dialer.

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

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

Integrar ação de envio direto de SMS

Aqui está um exemplo de Dialer integrando 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 no TTR e na resposta direta

A API atualizada agora usa uma classe Conversation versátil, permitindo operações além do domínio de notificação e ampliando os recursos dentro do contexto do aplicativo. Isso substitui o requisito anterior de uso da classe StatusBarNotification .

Depurar Mensageiro do Carro

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
    
    • Procure 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. Por exemplo:

    Lista de dispositivos Figura 5. Lista de dispositivos.

  3. Se nenhum dispositivo for encontrado, faça o seguinte :

    • Reconecte-se ao Bluetooth.

    OU

    • Nas configurações de Bluetooth, confirme se a mensagem de texto está ativada.

    OU

    • No telefone, confirme se o acesso à mensagem foi concedido.

Depurar bancos de dados Bluetooth

O Car Messenger é baseado no banco de dados de telefonia. Para determinar se o Bluetooth está preenchendo esse banco de dados, você pode usar os comandos da tabela.

Tarefa Comando
Conversação adb shell content query--uri content://mms-sms/conversations?simple=true
Apenas mensagens SMS adb shell content query--uri content://sms
Mensagens MMS/SMS adb shell content query--uri content://mms-sms/conversations
Apenas mensagens MMS adb shell content query--uri content://mms
Apenas caixa de entrada MMS adb shell content query--uri content://mms/conversations/inbox
Apenas mensagens enviadas por SMS 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 do Car Messenger e do assistente de voz

Os logs são impressos por padrão se a imagem de compilação for eng ou userdebug . Caso contrário, para ativar o registro no Car Messenger:

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

  2. Habilite o registro em log para o Preloaded Assistant .

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