Gerenciar controles de TV

Os dispositivos de TV exigem um dispositivo de hardware secundário para a interação com apps: um controle remoto básico ou controle de jogo. Portanto, o app precisa oferecer suporte à entrada do botão direcional (D-pad). Além disso, o app pode precisar gerenciar controladores off-line e entrada para mais de um tipo de controlador.

Este guia discute os requisitos para o gerenciamento de controladores para dispositivos de TV.

Controles mínimos do botão direcional

O controlador padrão para um dispositivo de TV é um botão direcional. 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, tente oferecer suporte ao jogo usando apenas esses controles D-pad. Caso contrário, avise o usuário de que um controle é necessário e permita que ele saia do jogo normalmente usando o botão direcional.

Para mais informações sobre a navegação com controladores D-pad para dispositivos de TV, consulte Navegação na TV.

Tratar desconexões do controlador

Os controladores para TV são frequentemente dispositivos Bluetooth, que podem tentar economizar energia entrando periodicamente no modo de suspensão e se desconectando do dispositivo de TV. Isso significa que um app pode ser interrompido ou reiniciado se não estiver configurado para processar esses eventos de reconexão. Esses eventos podem acontecer em qualquer uma das seguintes circunstâncias:

  • Enquanto um vídeo de vários minutos de duração é reproduzido, um botão direcional ou controle de jogo pode entrar no modo de espera, se desconectar do dispositivo de TV e se reconectar mais tarde.
  • Durante o jogo, um novo jogador pode entrar no jogo usando um controle de jogo que ainda não está conectado.
  • Durante o jogo, um jogador pode sair e desconectar um controlador de jogo.

Qualquer atividade de app de TV sujeita a eventos de desconexão e reconexão precisa ser configurada para processar eventos de reconexão no manifesto do app. O exemplo de código a seguir demonstra como ativar uma atividade para processar mudanças de configuração, incluindo um teclado ou dispositivo de navegação que se conecta, desconecta ou reconecta:

<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 de configuração permite que o app continue sendo executado durante um evento de reconexão , em vez de ser reiniciado pelo framework do Android, o que não é uma boa experiência do usuário.

Gerenciar variações de entradas do botão direcional

Os usuários de dispositivos de TV podem ter mais de um tipo de controlador que usam com a TV. Por exemplo, um usuário pode ter um controlador de botão direcional básico e um controle de jogo. Os códigos de chave fornecidos por um controle de jogo quando está sendo usado para funções de botão direcional podem variar dos códigos de chave enviados por um botão direcional básico.

Gerencie as variações na entrada D-pad para que o usuário não precise trocar de controlador para operar o app. Para mais informações sobre como processar variações de entrada, consulte Processar entrada do botão direcional.

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 pretendido para o botão pode ser um evento de mídia, como reproduzir, pausar ou parar, ou pode ser um evento do tipo TV, como seleção ou navegação. Para oferecer uma boa experiência do usuário, atribua um comportamento consistente aos botões do controlador.

Eventos de IU da TV

Atribua o comportamento da interface da TV aos botões que geram tipos KeyEvent, conforme mostrado na tabela a seguir:

KeyEventComportamento
KEYCODE_BUTTON_B, KEYCODE_BACKVoltar
KEYCODE_BUTTON_SELECT, KEYCODE_BUTTON_A, KEYCODE_ENTER, KEYCODE_DPAD_CENTER, KEYCODE_NUMPAD_ENTERSeleção
KEYCODE_DPAD_UP, KEYCODE_DPAD_DOWN, KEYCODE_DPAD_LEFT, KEYCODE_DPAD_RIGHTNavegação

Eventos de mídia

Quando o usuário estiver assistindo mídia, atribua um comportamento aos botões que geram tipos KeyEvent, conforme mostrado na tabela a seguir. Se o app estiver controlando uma MediaSession, use um MediaControllerAdapter para chamar um dos MediaControllerCompat.TransportControls métodos mostrados na tabela. Os botões de seleção atuam como botões de reprodução ou pausa nesse contexto.

KeyEventChamada TransportControlsComportamento
BUTTON_SELECT, BUTTON_A, ENTER, DPAD_CENTER, KEYCODE_NUMPAD_ENTER play()Google Play
BUTTON_START, BUTTON_SELECT, BUTTON_A, ENTER, DPAD_CENTER, KEYCODE_NUMPAD_ENTER pause()Pausar
BUTTON_R1skipToNext()Pular para a próxima
BUTTON_L1skipToPrevious()Pular para a anterior
DPAD_RIGHT, BUTTON_R2, AXIS_RTRIGGER, AXIS_THROTTLEfastForward()Avançar
DPAD_LEFT, BUTTON_L2, AXIS_LTRIGGER, AXIS_BRAKErewind()Voltar
N/Astop()Parar

Observação: ao usar uma MediaSession, não substitua o processamento de botões específicos de mídia, como KEYCODE_MEDIA_PLAY ou KEYCODE_MEDIA_PAUSE. O sistema aciona automaticamente o método apropriado MediaSession.Callback.

Fornecer comportamento adequado do botão "Voltar"

O botão "Voltar" nunca deve funcionar como um botão de alternância. Por exemplo, não o use para abrir e fechar um menu. Use-o apenas para navegar para trás, no estilo de navegação estrutural, pelas telas anteriores em que o jogador esteve.

Como o botão "Voltar" executa apenas a navegação linear para trás, você pode usar para sair de um menu no app aberto por um botão diferente e retornar ao app. Pressionar o botão "Voltar" consecutivamente sempre leva à tela inicial do Android TV. Por exemplo: jogo > tela de pausa do jogo > tela principal do jogo > tela inicial do Android TV ou reprodução de programa de TV > tela principal do app de TV > tela inicial do Android TV.

Para mais informações sobre design para navegação, consulte Como projetar uma navegação de retorno e de topo. Para saber mais sobre a implementação, consulte Fornecer navegação de retorno adequada.

Gerenciar controladores para jogos

Compatibilidade com controles de botão direcional

Planeje seu esquema de controle com um botão direcional, porque esse tipo de controle é o padrão para dispositivos com Android TV. É necessário que o jogador possa usar um botão direcional em todos os aspectos do jogo, não só para controlar a jogabilidade principal, mas para navegar nos menus e nos anúncios. Por esse motivo, seu jogo para Android TV não deve se referir a uma interface de toque com linguagem como "Toque aqui para continuar."

A forma como você molda a interação do jogador com o controlador pode ser fundamental para alcançar uma ótima experiência do usuário. Considere as práticas recomendadas a seguir:

  • 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 botão direcional, deixe isso claro. Um jogador que usa um controlador inadequado para um jogo pode ter uma experiência ruim e dar uma classificação ruim ao jogo.
  • Use um mapeamento de botões consistente: o mapeamento de botões intuitivo é essencial para uma boa experiência do usuário. Por exemplo, siga os costumes aceitos usando 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, mas se o controle do jogador não tiver hardware de acelerômetro e giroscópio, balançá-lo não funcionará. Consulte o controle e, se a detecção de movimento não for compatível, mude 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.

Usar os botões apropriados

Nem todos os controladores de jogos oferecem os botões "Iniciar", "Pesquisar" ou "Menu". Verifique se a interface não depende 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, pause o jogo e mostre uma caixa de diálogo solicitando que o jogador desconectado reconecte o controlador.

Além disso, ofereça dicas de solução de problemas na caixa de diálogo. Por exemplo, diga ao jogador para "Verificar a conexão Bluetooth". Para mais informações sobre como implementar a compatibilidade com dispositivos de entrada, consulte Gerenciar ações do controlador e a Visão geral do Bluetooth.

Mostrar instruções de controladores

Se o jogo oferecer instruções visuais de controle do jogo, use uma imagem do controlador sem marca e inclua 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.