O Car Messenger oferece recursos de mensagens projetados para dispositivos automotivos. Assim como outros apps para carro, os usuários iniciam o Car Messenger pelo acesso rápido.
O que há de novo no Car Messenger?
Com o novo app Car Messenger, os motoristas podem:
- Tenha uma experiência de mensagens dedicada.
- Inicie o Car Messenger no acesso rápido.
- Navegue pelas mensagens recebidas antes e durante uma viagem.
- Ouvir e responder mensagens.
- Desativar o som das notificações de mensagens.
- Iniciar novas conversas.
Terminologia
Estes termos são usados nesta página:
Benefícios dos apps desagrupados
Os apps independentes, 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 não agrupados.
Detalhes técnicos
Esta seção descreve a arquitetura do Car Messenger. Para saber mais, consulte Integrar com CarVoiceInteractionSession.
Arquitetura baseada em telefonia
Quando pareados por Bluetooth, os dados são sincronizados do banco de dados de telefonia do smartphone para 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.
Essa funcionalidade foi introduzida no Android 12. Os principais benefícios incluem:
- As mensagens de usuários em massa podem ser recuperadas de um banco de dados.
- As mensagens de viagens anteriores são compatíveis.
- Usa uma arquitetura e uma API semelhantes para armazenamento e recuperação de SMS em smartphones Android.
- Fica totalmente desvinculado da plataforma Android.
Este é o fluxo:
Figura 1. Fluxo de dados com base 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. Tratamento 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 são excluídos do banco de dados do carro.
Baixar o Car Messenger
Baixe o commit mais recente do Car Messenger no Google Git.
APIs de interação por voz
O Car Messenger usa APIs CarVoiceInteractionSession para se integrar ao assistente. Esses elementos são descritos nas seções a seguir.
Modelo PendingIntent
Essas APIs usam PendingIntent
para transmitir consultas resolvidas do Google Assistente de volta ao
Car Messenger.
Esta é a sequência de eventos:
O Car Messenger inicia o Google Assistente chamando
activity.showAssist(Bundle args)
. Os argumentos contêm a ação da API e os parâmetros obrigatórios, incluindo uma intent pendente, se necessário.O Google Assistente recupera a entrada do usuário, se necessário, e a agrupa 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 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 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 composiçã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 de envio direto de SMS
Confira um exemplo do discador 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 na 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ções e estendendo os recursos
no contexto do app. Isso substitui a exigência anterior de usar a classe StatusBarNotification
.
Depurar o Car Messenger
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
- Procure
MapClientService
na saída do comando dumpsys.
Profile: MapClientService mCurrentDevice: 99:99 (Pixel XL) name=Mce state=Connected
- Procure
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:
- Reconecte-se ao Bluetooth.
OU
- Em 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 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 |
Apenas 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 |
Mensagem MMS, parte 1 (substitua 1 pelo ID da MMS) |
adb shell content query --uri content://mms/part/1 |
Depurar consultas do Car Messenger e do assistente de voz
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 do Car Messenger:
Execute para as tags relevantes
adb shell setprop log.tag.<TAG> DEBUG
.Ative o registro em registros para o Assistente pré-carregado.
Para bugs altamente reproduzíveis, use pontos de interrupção com o Android Studio.