Use entradas personalizadas de OEM para adicionar novos eventos de entrada de carro a recursos novos e
não padrão do Android. Eventos de entrada não padrão não são mapeados pelo
KeyEvent
do Android, projetados para ser genéricos e funcionar em qualquer plataforma do Android,
mas não estendidos para implementar recursos específicos de OEM. Por exemplo, um botão
localizado no controle do volante que, quando pressionado, abre um app Maps
(por uma intent) com a localização atual do carro. Esse recurso permite que
os motoristas visualizem a localização atual sem se distrair enquanto
dirigem.
Este artigo descreve como reutilizar um KeyEvent
do Android para
criar um CustomInputEvent
para uso somente quando nenhum KeyEvent
do Android puder
ser usado para representar o recurso.
HW_CUSTOM_INPUT
Uma entrada personalizada de OEM é representada por HW_CUSTOM_INPUT e
CustomInputEvent.java. HW_CUSTOM_INPUT é o
evento nativo, instanciado pelo hardware do carro (HAL do veículo). Os OEMs determinam
como instanciar esse evento. O acesso a HW_CUSTOM_INPUT está definido como [somente leitura], com VehiclePropertyAccess:READ
.
Para garantir que o HAL do veículo sempre transmita o valor mais recente disponível, a
notificação HW_CUSTOM_INPUT é definida como ON_CHANGE
, com
VehiclePropertyChangeMode:ON_CHANGE
.
Os valores HW_CUSTOM_INPUT são compostos por uma matriz de int32
genéricos, definidos como global. Os três
inteiros genéricos são:
O primeiro elemento representa o código de entrada a ser definido pelo OEM. Você pode associar qualquer semântica ao código de entrada.
O segundo elemento armazena a tela de destino, como a tela principal ou o cluster.
O terceiro elemento contém o número de vezes que o evento foi repetido. Por exemplo, para indicar quantas vezes um botão foi pressionado.
CustomInputEvent e API Car Input
InputHalService é o serviço do carro que recebe um
HW_CUSTOM_INPUT
de entrada da HAL do veículo.
O InputHalService converte o HW_CUSTOM_INPUT
recebido em
CustomInputEvent
, uma classe parcelable Java localizada em
car-lib/src/android/car/input, com a respectiva
interface aidl.
O CarInputService, um serviço principal de entrada do carro, recebe CustomInputEvents de entrada e os envia para qualquer serviço do sistema Android registrado.
Para registrar e receber CustomInputEvents, os serviços do sistema precisam:
Implemente CarInputManager.CarInputCaptureCallback#onKeyEvents.
Registre-se pelo CarInputManager#requestInputEventCapture, transmitindo
CarInputManager.INPUT_TYPE_CUSTOM_INPUT_EVENT
como o parâmetro de tipo de entrada.Para cancelar o registro, os serviços precisam invocar CarInputManager#releaseInputEventCapture.
O diagrama a seguir ilustra o fluxo de trabalho de um evento de entrada personalizada do OEM.
Serviços do sistema OEM para Android
Os OEMs oferecem o próprio serviço do sistema Android para processar CustomInputEvents
de CarInputService
.
Somente os serviços marcados com a permissão de privilégio android.permission.INJECT_EVENTS podem registrar e receber CustomInputEvents da API Car Input (CarInputManager). Nenhum serviço ou aplicativo de terceiros pode ser assinado com essa permissão do sistema Android (somente serviços OEM). Portanto, nenhum serviço ou aplicativo de terceiros pode se registrar na API Car Input.
Os serviços do sistema Android do OEM podem acessar SystemApi
e métodos públicos.
Implementação de referência
Consulte a implementação de referência em packages/services/Car/tests/SampleCustomInputService, que é fornecido como um exemplo e uma diretriz. Por exemplo, para adicionar um novo botão no controle do volante. Quando pressionado, esse novo botão inicia o app de mapas com a localização atual do carro.
Neste exemplo, o OEM selecionou INPUT_CODE_F1
(a primeira função de conveniência CustomInputEvent
) para representar esse novo recurso, abrindo o app de mapas com a localização atual do carro.
Durante a inicialização, esse serviço se registra em CarInputManager
usando requestInputEventCapture
. Consulte o
código de registro de implementação de referência.
Ao receber CustomInputEvents, esse serviço envia a intent para iniciar o app Maps. Para saber como isso é feito, consulte CustomInputEventListener.java.