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 Car Messenger?
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 a CarVoiceInteractionSession.
Arquitetura baseada em telefonia
Quando pareado por Bluetooth, os dados são sincronizados do banco de dados de telefonia do smartphone com o banco de dados de telefonia 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 introduzido 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 aceitas.
- Usa uma arquitetura e uma API semelhante para armazenamento e recuperação de SMS em smartphones Android.
- É totalmente desmemorizado 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 se conectar, os dados são transferidos do smartphone para o carro usando o Bluetooth MAP.
- Quando a conexão é desconectada, os dados do smartphone sã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 por 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 de assistente resolvidas de volta ao
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 domínio de notificação e ampliando os recursos
no contexto do app. Isso substitui o requisito anterior de usar a
classe StatusBarNotification
.
Debug 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:
- Conecte-se novamente ao Bluetooth.
OU
- Nas Configurações do 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 do 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 |
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 |
Parte da mensagem MMS 1 (substitua 1 pelo ID do MMS) |
adb shell content query--uri content://mms/part/1 |
Depurar consultas do Messenger do carro 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 para o Assistente pré-carregado.
Para bugs altamente reproduzíveis, use pontos de interrupção com o Android Studio.