Entradas personalizadas OEM

Use entradas personalizadas OEM para adicionar novos eventos de entrada de carro para recursos novos e não padrão do Android. Eventos de entrada não padrão não são mapeados pelo Android KeyEvent existente, projetado para ser genérico e funcionar em qualquer superfície Android, mas não estendido para implementar recursos específicos de OEM. Por exemplo, um botão localizado no controle do volante que, ao ser pressionado, abre um app de mapas (através de um intent) com a localização atual do carro. Esse recurso permite que os motoristas visualizem sua localização atual sem se distrair enquanto dirigem.

Este artigo descreve como reutilizar um Android KeyEvent existente para criar um CustomInputEvent para uso somente quando nenhum Android KeyEvent puder ser usado para representar o recurso.

HW_CUSTOM_INPUT

Uma entrada customizada OEM é representada por HW_CUSTOM_INPUT e CustomInputEvent.java . HW_CUSTOM_INPUT é o evento nativo, instanciado pelo hardware do carro (Vehicle HAL). Os OEMs determinam como instanciar esse evento. O acesso a HW_CUSTOM_INPUT é definido como [somente leitura]{:.external}, com VehiclePropertyAccess:READ .

Para garantir que o Vehicle HAL sempre possa transmitir o último valor 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 um array de int32 genérico, definido como [global]{:.external} (com VehicleArea:GLOBAL ) Os três inteiros genéricos são:

  1. 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.

  2. O segundo elemento armazena a exibição de destino, como a exibição principal ou cluster.

  3. 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 de entrada de carro

InputHalService é o serviço de carro que recebe um HW_CUSTOM_INPUT de entrada do HAL do veículo.

InputHalService converte o HW_CUSTOM_INPUT de entrada em CustomInputEvent , uma classe parcelable Java localizada em car-lib/src/android/car/input , juntamente com a respectiva interface aidl .

CarInputService , um serviço principal de entrada de carro, recebe CustomInputEvents de entrada e os envia para qualquer serviço do sistema Android registrado.

Para registrar e receber CustomInputEvents de entrada, os serviços do sistema devem:

O diagrama a seguir ilustra o fluxo de trabalho de um evento de entrada personalizada OEM.

Fluxo de trabalho de entrada personalizada OEM

Serviços do sistema Android OEM

Os OEMs fornecem seu serviço de sistema Android para lidar com CustomInputEvents recebidos 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 de entrada do carro ( CarInputManager ). Nenhum serviço ou aplicativo de terceiros pode ser assinado com esta 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 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 aplicativo 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 aplicativo de mapas com a localização atual do carro).

Durante a inicialização, esse serviço se registra no CarInputManager por meio de requestInputEventCapture (consulte o código de registro de implementação de referência .

Ao receber CustomInputEvents de entrada, esse serviço envia a intenção de iniciar o aplicativo de mapas. Para saber como isso é feito, consulte CustomInputEventListener.java .