Dispositivos de TV exigem um dispositivo de hardware secundário para a interação com aplicativos na forma de um controle remoto básico ou controlador de jogo. Isso significa que o app precisa ser compatível com a entrada D-pad. Também significa que o app precisa gerenciar controladores off-line e entrada para mais de um tipo de controlador.
Esta lição discute as exigências para o tratamento de controladores para dispositivos de TV.
Controles D-pad mínimos
O controlador padrão para um dispositivo de TV é um D-pad. Em geral, o app precisa ser operado em um controlador remoto que tenha somente os botões para cima, para baixo, para a esquerda, para a direita, selecionar, voltar e início. Se o app for um jogo que normalmente requer um controle de jogo com controles adicionais, o jogo precisa tentar permitir esses controles D-pad. Nesse caso, o app precisa também avisar ao usuário que um controlador é necessário e permitir que a pessoa saia do jogo facilmente usando o controlador D-pad. Para mais informações sobre como gerenciar a navegação com controle D-pad para dispositivos de TV, consulte Criar navegação na TV.
Tratar desconexões do controlador
Controladores para TV são frequentemente dispositivos Bluetooth que tentam economizar energia entrando periodicamente no modo de suspensão e desconectando-se do dispositivo de TV. Isso significa que um aplicativo poderá ser interrompido ou reiniciado se não estiver configurado para tratar esses eventos de reconexão. Esses eventos podem acontecer em qualquer uma das seguintes circunstâncias:
- Durante a exibição de um vídeo de vários minutos de duração, um D-pad ou controlador de jogo entra no modo de suspensão do dispositivo de TV e reconecta-se mais tarde.
- Durante o jogo, um novo jogador entrar usando um controle que não está conectado no momento.
- Durante o jogo, um jogador sair e desconecta um controlador de jogo.
Qualquer atividade de app de TV sujeita a eventos de desconexão e reconexão precisa ser configurada para tratar eventos de reconexão no manifesto do app. A amostra de código seguinte demonstra como permitir que uma atividade trate mudanças na configuração, incluindo um teclado ou dispositivo de navegação que se conecte, desconecte ou reconecte:
<activity android:name="com.example.android.TvActivity" android:label="@string/app_name" android:configChanges="keyboard|keyboardHidden|navigation" android:theme="@style/Theme.Leanback"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LEANBACK_LAUNCHER" /> </intent-filter> ... </activity>
Essa mudança da configuração permite que o app continue a ser executado em um evento de reconexão, em vez de ser reiniciado pela estrutura de trabalho do Android, o que não é uma boa experiência para o usuário.
Gerenciar variações de entradas do D-pad
Os usuários de dispositivos de TV podem ter mais de um tipo de controlador para uso com a TV. Por exemplo, um usuário pode ter um controlador D-pad básico e um controlador de jogo. Os códigos de chave fornecidos por um controlador de jogo quando está sendo usado para funções D-pad pode diferir dos códigos de chave enviados por um D-pad físico.
O app precisa tratar as variações de entrada D-pad de um controlador de jogo de forma que o usuário não tenha que mudar fisicamente os controladores para operar o app. Para mais informações sobre como tratar essas variações de entrada, consulte Gerenciar ações do controlador.
Gerenciar eventos de botão
Quando o usuário clica em um botão de um controlador, seu app recebe um evento com KeyEvent. O comportamento esperado do botão pode ser de evento de mídia (como abrir, pausar ou parar) ou de evento semelhante a TV (como seleção ou navegação). Para proporcionar uma boa experiência do usuário, seu app precisa ter um comportamento consistente com os botões de controladores.
Eventos de IU da TV
Os botões que geram esses KeyEvents precisam ser gerenciados pelo app de acordo com a tabela abaixo.
KeyEvent | Comportamento |
---|---|
BUTTON_B, BACK | Voltar |
BUTTON_SELECT, BUTTON_A, ENTER, DPAD_CENTER, KEYCODE_NUMPAD_ENTER | Seleção |
DPAD_UP, DPAD_DOWN, DPAD_LEFT, DPAD_RIGHT | Navegação |
Eventos de mídia
Quando o usuário estiver assistindo mídia, os botões que geram esses KeyEvents precisarão ser gerenciados pelo seu app de acordo com a tabela abaixo. Se o app estiver controlando um MediaSession
, ele precisará usar um MediaControllerAdapter
para chamar um dos métodos MediaControllerCompat.TransportControls
, conforme mostrado abaixo. Observe que os botões de seleção funcionam como botões Reproduzir/Pausar nesse contexto.
KeyEvent | Chamada TransportControls | Comportamento |
---|---|---|
BUTTON_SELECT, BUTTON_A, ENTER, DPAD_CENTER, KEYCODE_NUMPAD_ENTER | pause() | Reproduzir |
BUTTON_START, BUTTON_SELECT, BUTTON_A, ENTER, DPAD_CENTER, KEYCODE_NUMPAD_ENTER | pause() | Pausar |
BUTTON_R1 | skipToNext() | Pular para a próxima |
BUTTON_L1 | skipToPrevious() | Pular para a anterior |
DPAD_RIGHT, BUTTON_R2, AXIS_RTRIGGER, AXIS_THROTTLE | fastForward() | Avançar |
DPAD_LEFT, BUTTON_L2, AXIS_LTRIGGER, AXIS_BRAKE | rewind() | Voltar |
(Nenhum KeyEvent está associado a parar) | stop() | Parar |
Gerenciar controladores para jogos
Compatibilidade com controles D-pad
Planeje seu esquema de controle com um botão direcional (D-pad), porque esse tipo de controle é o padrão para dispositivos com Android TV. É necessário que o jogador possa usar um D-pad em todos os aspectos do jogo, não só para controlar as principais ações de jogo, mas para navegar nos menus e nos anúncios. Portanto, seu jogo para Android TV não deve se referir especificamente a uma interface de toque. Por exemplo, um jogo para Android TV não deve indicar ao jogador "Toque aqui para continuar".
A forma como você modela a interação do jogador com o controlador pode ser fundamental para gerar uma ótima experiência do usuário:
- Comunique os requisitos do controlador antecipadamente. Use sua descrição do Google Play para informar ao jogador todas as expectativas sobre os controles. Se um jogo é mais adequado para um gamepad com joystick do que para um D-pad, deixe isso claro. Um jogador que usar um controle inadequado para o jogo provavelmente terá uma experiência inferior e penalizará seu jogo nas avaliações.
- Usar mapeamento de botões consistente. O mapeamento de botões intuitivo e flexível é essencial para uma boa experiência do usuário. Por exemplo, você precisa aderir aos costumes aceitos, como usar o botão A para Aceitar e o botão B para Cancelar. Você também pode oferecer flexibilidade na forma de remapeamento. Para mais informações sobre o mapeamento de botões, consulte Gerenciar ações do controlador.
- Detecte as capacidades do controle e faça os ajuste necessários. Consulte o controlador sobre os recursos dele para otimizar a correspondência entre o controlador e o jogo. Por exemplo, você pode desejar que um jogador direcione um objeto balançando o controlador no ar. No entanto, se o controle do jogador não tiver hardware de acelerômetro e giroscópio, balançá-lo não funcionará. Assim, seu jogo precisa consultar o controle e, se a detecção de movimento não for compatível, mudar para um esquema de controle alternativo disponível. Para mais informações sobre como consultar os recursos de controladores, consulte Compatibilidade com controladores em diversas versões do Android.
Fornecer comportamento adequado do botão "Voltar"
O botão "Voltar" não deve funcionar como um botão de alternância. Por exemplo, não o use para abrir e fechar um menu. Ele precisa navegar apenas para trás, no estilo de navegação estrutural, pelas telas anteriores em que o jogador esteve, como, por exemplo: Reprodução do jogo > Tela de pausa do jogo > Tela principal do jogo > Tela inicial do Android.
Como o botão "Voltar" deve executar apenas a navegação linear (para trás), você pode usar o botão "Voltar" para sair do menu do jogo (aberto por um outro botão) e retornar ao jogo. Para mais informações sobre design para navegação, consulte Navegação com Voltar e Para cima. Para saber mais sobre a implementação, consulte Fornecer navegação de retorno adequada.
Usar os botões apropriados
Nem todos os controladores de jogos oferecem os botões "Iniciar", "Pesquisar" ou "Menu". Garanta que sua IU não dependa do uso desses botões.
Gerenciar vários controles
Quando vários jogadores estão jogando, cada um com o próprio controlador, é importante mapear cada par de jogador/controlador. Para informações sobre como implementar a identificação de número de controlador, consulte getControllerNumber()
.
Tratar desconexões do controlador
Quando um controle é desconectado no meio do jogo, ele precisa pausar, e uma caixa de diálogo precisa aparecer solicitando que o jogador desconectado reconecte o controlador.
A caixa de diálogo também precisa oferecer dicas de solução de problemas (por exemplo, uma caixa de diálogo pop-up orientando que o jogador verifique a conexão Bluetooth). Para mais informações sobre como implementar a compatibilidade com dispositivos de entrada, consulte Gerenciar ações do controlador. Há informações específicas sobre conexões Bluetooth na seção Bluetooth.
Mostrar instruções de controladores
Se o jogo oferecer instruções visuais de controle do jogo, a imagem do controlador não deverá conter branding e incluir apenas botões compatíveis com o Android.
Para ver exemplos de imagens de um controlador compatível com Android, faça o download do Modelo do gamepad para Android TV. Ele inclui um controle branco sobre um fundo preto e um controle preto sobre um fundo branco (mostrados na figura 1), como um arquivo PNG e um arquivo do Adobe® Designer®.

Figura 1. Exemplo de instruções de controlador usando o Modelo do gamepad para Android TV (ZIP).