Gerenciar controles de TV

Os dispositivos de TV exigem um dispositivo de hardware secundário para interagir com apps: um controle remoto básico ou um controle de jogo. Portanto, o app precisa oferecer suporte à entrada por botão direcional. Além disso, seu app pode precisar lidar com controles que ficam off-line e entrada de mais de um tipo de controlador.

Este guia discute os requisitos para lidar com controles para dispositivos de TV.

Controles D-pad mínimos

O controlador padrão para um dispositivo de TV é um D-pad. Em geral, seu app precisa ser compatível com um controlador remoto que tenha apenas 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 com controles adicionais, tente oferecer suporte à jogabilidade apenas com esses controles D-pad. Caso contrário, avise o usuário de que um controle é necessário e deixe-o sair do jogo normalmente usando o controle D-pad.

Para mais informações sobre a navegação com controles D-pad para dispositivos de TV, consulte 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 da TV. Isso significa que um app poderá 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 tem vários minutos de duração, um botão direcional ou controle de jogo pode entrar no modo de suspensão, desconectar do dispositivo de TV e reconectar mais tarde.
  • Durante o jogo, um novo jogador pode entrar usando um controle que ainda não está conectado.
  • Durante o jogo, um jogador pode sair e desconectar um controle 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 permitir que uma atividade processe mudanças de configuração, incluindo a conexão, desconexão ou reconexão de um teclado ou dispositivo de navegação:

<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 a ser executado em um evento de reconexão, em vez de ser reiniciado pelo framework 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 controle para eles. Por exemplo, um usuário pode ter um controle direcional básico e um controle de jogo. Os códigos de tecla fornecidos por um controle de jogo quando ele está sendo usado para funções D-pad podem ser diferentes dos códigos enviados por um D-pad básico.

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

Gerenciar eventos de botão

Quando o usuário clica em um botão em um controlador, seu app recebe um evento com um KeyEvent. O comportamento esperado do botão pode ser um evento de mídia, como abrir, pausar ou parar, ou 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 controle.

Eventos de IU da TV

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

KeyEventComportamento
KEYCODE_BUTTON_B, KEYCODE_BACKVoltar
KEYCODE_BUTTON_SELECT, KEYCODE_BUTTON_A, KEYCODE_ENTER, KEYCODE_DPAD_CENTER e KEYCODE_NUMPAD_ENTERSeleção
KEYCODE_DPAD_UP, KEYCODE_DPAD_DOWN, KEYCODE_DPAD_LEFT e 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 de KeyEvent, conforme mostrado na tabela abaixo. Se o app estiver controlando um MediaSession, use um MediaControllerAdapter para chamar um dos métodos MediaControllerCompat.TransportControls mostrados na tabela. Os botões de seleção funcionam como "Reproduzir" ou "Pausar" nesse contexto.

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

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

Oferecer o comportamento adequado do botão "Voltar"

O botão "Voltar" nunca pode funcionar como um botão de alternância. Por exemplo, não o use para abrir e fechar um menu. Use essa opção apenas para voltar, no estilo 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 usá-lo para deixar um menu no app aberto por um botão diferente e retornar ao app. Pressionar o botão "Voltar" consecutivamente sempre precisa levar à tela inicial do Android TV. Por exemplo: jogo > tela de pausa do jogo > tela principal do jogo > tela inicial do Android TV ou exibição do programa de TV > tela principal do app para TV > tela inicial do Android TV.

Para saber mais sobre design para navegação, consulte Como projetar uma navegação de retorno e de cima. Para saber mais sobre a implementação, consulte Como oferecer uma navegação de retorno adequada.

Gerenciar controladores para jogos

Compatibilidade com controles D-pad

Planeje seu esquema de controle em torno de um controle D-pad, já que esse conjunto de controles é o padrão para dispositivos Android TV. O jogador precisa ser capaz de usar um botão direcional para todos os aspectos do jogo, não apenas para controlar a jogabilidade principal, mas também para navegar pelos menus e anúncios. Por esse motivo, verifique se o jogo para Android TV não se refere a uma interface de toque com idiomas como "Toque aqui para continuar".

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

  • Comunique os requisitos do controlador antecipadamente:use a descrição do Google Play para comunicar ao jogador todas as expectativas sobre os controles. Se um jogo for mais adequado para um gamepad com joystick do que um com apenas um botão direcional, deixe isso claro. Um jogador que usa um controle inadequado para o jogo pode ter uma experiência ruim e dar uma classificação ruim ao seu jogo.
  • Use um mapeamento de botões consistente:o mapeamento intuitivo de botões é 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 Processar ações do controlador.
  • Detecte recursos do controle e faça os ajustes necessários: consulte o controlador sobre os recursos dele para otimizar a correspondência entre o controle e o jogo. Por exemplo, você pode querer que o jogador controle um objeto balançando o controle no ar, mas, se o controle do jogador não tiver um hardware de acelerômetro e giroscópio, balançar 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 recursos de controladores, consulte Suporte a controladores em versões do Android.

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 controle, é importante mapear cada par de jogador/controlador. Para mais informações sobre como implementar a identificação de número de controlador, consulte getControllerNumber().

Tratar desconexões do controlador

Quando um controle for desconectado no meio do jogo, pause-o e mostre uma caixa de diálogo solicitando que o jogador desconectado reconecte o controle.

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

Mostrar instruções de controladores

Se o jogo fornecer instruções visuais de controle, use uma imagem do controlador sem marcas e inclua apenas botões compatíveis com o Android.

Para ver exemplos de imagens de um controle compatível com Android, faça o download do Modelo do gamepad para Android TV (ZIP). Ele inclui um controle branco em um fundo preto e um controle preto em um fundo branco (mostrado na Figura 1) como um arquivo PNG e um arquivo do Adobe® Illustrator®.

Figura 1. Exemplo de instruções de controlador usando o modelo de gamepad do Android TV.