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:
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:
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:
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:
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.O Google Assistente recupera a entrada do usuário, se necessário, e a empacota com a intent pendente.
O Google Assistente envia a intent de volta para o Car Messenger.
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 - 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:
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:
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
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
- Pesquise
Confirme se o dispositivo correto está listado. Exemplo:
Figura 5. Lista de dispositivos.
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:
Execute as tags relevantes
adb shell setprop log.tag.<TAG> DEBUG
.Ative o registro para o Google Assistente pré-carregado.
Para bugs altamente reproduzíveis, use pontos de interrupção com o Android Studio.