Cómo administrar controladores de TV

Los dispositivos de TV necesitan un dispositivo de hardware secundario para interactuar con apps, ya sean simples controles remotos o controles de juego. Por lo tanto, tu app debe admitir la entrada de pad direccional. Además, es posible que tu app necesite manejar controles sin conexión y entradas de más de un tipo de control.

En esta guía, se analizan los requisitos para manejar controles para dispositivos de TV.

Controles mínimos para pad direccional

El control predeterminado para un dispositivo de TV es el pad direccional. En general, tu app debe poder operarse desde un control remoto que solo tenga los botones de arriba, abajo, izquierda, derecha, seleccionar, inicio y atrás. Si tu app es un juego que normalmente requiere un control de juego con controles adicionales, intenta admitir el juego solo con estos controles del pad direccional. De lo contrario, advierte al usuario que se requiere un control y permítele salir del juego correctamente con el control de pad direccional.

Para obtener más información sobre la navegación con controles de pad direccional para dispositivos de TV, consulta Navegación para TV.

Administra la desconexión de controles

Los controles para TV, a menudo son dispositivos Bluetooth que pueden intentar ahorrar energía al entrar en modo de suspensión y desconectarse del dispositivo de TV. Esto significa que una app puede interrumpirse o reiniciarse si no se configura para admitir estos eventos de reconexión. Estos eventos pueden ocurrir en cualquiera de las siguientes circunstancias:

  • Mientras se reproduce un video de varios minutos de duración, un pad direccional o control de juego puede entrar en modo de suspensión, desconectarse del dispositivo de TV y luego volver a conectarse.
  • Durante un juego, un jugador nuevo puede unirse a la partida usando un control de juego que aún no está conectado.
  • Durante un juego, un jugador puede abandonar la partida y desconectar un control de juego.

Toda actividad de app para TV que esté sujeta a eventos de conexión y desconexión debe configurarse para manejar eventos de reconexión en el manifiesto de la app. En la siguiente muestra de código, podrás ver cómo habilitar una actividad para que maneje cambios de configuración, como la conexión, desconexión o reconexión de un teclado o un dispositivo de navegación:

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

Este cambio de configuración permite que la app continúe ejecutándose a través de un evento de reconexión , en vez de reiniciarse mediante el marco de trabajo de Android, lo que no supone una buena experiencia de usuario.

Administra las variaciones de entrada de pad direccional

Los usuarios de dispositivos de TV cuentan con más de un tipo de control que usan con su TV. Por ejemplo, un usuario puede tener un control de pad direccional básico y un control de juegos. Los códigos clave que envía un control de juego cuando se utiliza para las funciones de un pad direccional pueden variar con respecto a los códigos clave enviados por un pad direccional básico.

Administra las variaciones en la entrada de pad direccional para que el usuario no tenga que cambiar de control para usar tu app. Si quieres obtener más información sobre cómo manejar las variaciones de entrada, consulta Cómo procesar la entrada de pad direccional.

Administra eventos de botones

Cuando un usuario hace clic en un botón del control, tu app recibe un evento con un KeyEvent. El comportamiento pretendido para el botón puede ser un evento multimedia (como reproducir, pausar o detener contenido) o de TV (de selección o navegación). Para proporcionar una buena experiencia del usuario, asigna un comportamiento coherente a los botones del control.

Eventos de IU de TV

Asigna el comportamiento de la IU de TV a los botones que generan tipos KeyEvent como se muestra en la siguiente tabla:

KeyEventComportamiento
KEYCODE_BUTTON_B, KEYCODE_BACKAtrás
KEYCODE_BUTTON_SELECT, KEYCODE_BUTTON_A, KEYCODE_ENTER, KEYCODE_DPAD_CENTER, KEYCODE_NUMPAD_ENTERSelección
KEYCODE_DPAD_UP, KEYCODE_DPAD_DOWN, KEYCODE_DPAD_LEFT, KEYCODE_DPAD_RIGHTNavegación

Eventos multimedia

Cuando el usuario mira contenido multimedia, asigna un comportamiento a los botones que generan tipos KeyEvent como se muestra en la siguiente tabla. Si tu app controla una MediaSession, usa un MediaControllerAdapter para llamar a uno de los MediaControllerCompat.TransportControls métodos que se muestran en la tabla. Ten en cuenta que los botones de selección actúan como botones de reproducción o pausa en este contexto.

KeyEventLlamada de TransportControlsComportamiento
BUTTON_SELECT, BUTTON_A, ENTER, DPAD_CENTER, KEYCODE_NUMPAD_ENTER play()Reproducir
BUTTON_START, BUTTON_SELECT, BUTTON_A, ENTER, DPAD_CENTER, KEYCODE_NUMPAD_ENTER pause()Pausar
BUTTON_R1skipToNext()Siguiente
BUTTON_L1skipToPrevious()Anterior
DPAD_RIGHT, BUTTON_R2, AXIS_RTRIGGER, AXIS_THROTTLEfastForward()Adelantar
DPAD_LEFT, BUTTON_L2, AXIS_LTRIGGER, AXIS_BRAKErewind()Retroceder
N/Astop()Detener

Nota: Cuando usas una MediaSession, no anules el manejo de botones específicos de contenido multimedia, como KEYCODE_MEDIA_PLAY o KEYCODE_MEDIA_PAUSE. El sistema activa automáticamente el método adecuado. MediaSession.Callback

Proporciona el comportamiento adecuado del botón Atrás

El botón Atrás nunca debe cambiar de función. Por ejemplo, no lo uses para abrir y cerrar un menú. Solo úsalo para navegar hacia atrás, siguiendo la ruta de navegación hacia las pantallas anteriores en las que estuvo el jugador.

Debido a que el botón Atrás solo realiza una navegación lineal hacia atrás, puedes usar lo para dejar un menú dentro de la app que se abre con un botón diferente y volver a la app. Presionar el botón Atrás de forma consecutiva siempre debe llevar a la pantalla principal de Android TV. Por ejemplo: juego > pantalla de juego en pausa > pantalla principal del juego > pantalla principal de Android TV o reproducción de programas de TV > pantalla principal de la app de TV > pantalla principal de Android TV.

Para obtener información sobre el diseño para la navegación, consulta Cómo diseñar la navegación hacia atrás y arriba. Si quieres obtener información sobre la implementación, consulta Cómo brindar navegación hacia atrás de manera correcta.

Administración de controles para juegos

Admite controles de pad direccional

Planifica tu esquema de control de un mando de dirección (pad direccional), ya que su configuración es la predeterminada para dispositivos Android TV. El jugador tiene que poder usar un pad direccional en todo momento, no solo para controlar el juego real, sino también para navegar por los menúes y los anuncios. Por lo tanto, asegúrate de que tu juego para Android TV no se refiera a una interfaz táctil con un lenguaje como "Presiona aquí para continuar."

La manera en que diseñas la interacción del jugador con el control puede ser clave para lograr una gran experiencia del usuario Analiza las siguientes prácticas recomendadas:

  • Comunica los requisitos del control por adelantado: Usa la descripción de Google Play para comunicar al jugador cualquier expectativa sobre los controles. Deja en claro si el juego resulta mejor para un control de juegos con joystick que para un pad direccional. Un jugador que usa un control inadecuado para un juego puede tener una mala experiencia y darle una mala calificación al juego.
  • Usa una asignación de botones coherente: La asignación de botones intuitiva es clave para brindar una buena experiencia del usuario. Por ejemplo, adhiérete a las costumbres aceptadas y usa el botón A para aceptar y el B para cancelar. También puedes ofrecer flexibilidad en forma de reasignación. Para obtener más información sobre la asignación de botones, consulta Cómo manejar las acciones del control.
  • Detecta las funciones del control y ajústalas en consecuencia: Averigua las funciones del control para optimizar la coincidencia entre el control y el juego. Por ejemplo, tal vez quieras que un jugador dirija un objeto moviendo el control en el aire, pero si el control del jugador no tiene acelerómetro y giroscopio, esa acción no funcionará. Averigua la función del control y, si no es compatible con la detección de movimiento , cambia a otra alternativa disponible en el esquema del control. Para obtener información sobre cómo averiguar las funciones del control, consulta Compatibilidad de controles en diferentes versiones de Android.

Usa los botones correctos

No todos los controles de juego tienen los botones Inicio, Búsqueda o Menú. Asegúrate de que tu IU no dependa del uso de estos botones.

Administra varios controles

Cuando varios jugadores participan de un juego y cada uno usa su control, es importante mapear cada par jugador-control. Para obtener información sobre cómo implementar la identificación control-número, consulta getControllerNumber().

Administra la desconexión de controles

Cuando un control se desconecta en medio de un juego, pausa el juego y muestra un diálogo que solicite al jugador desconectado que vuelva a conectar el control.

Además, ofrece sugerencias de solución de problemas en el diálogo. Por ejemplo, dile al jugador que "Verifique su conexión Bluetooth". Para obtener más información sobre la implementación de compatibilidad con dispositivos de entrada, consulta Administra las acciones del control y la descripción general de Bluetooth.

Muestra instrucciones del control

Si tu juego proporciona instrucciones de control del juego visuales, usa una imagen del control sin recursos de marca y solo incluye botones compatibles con Android.

Para ver imágenes de ejemplo de un control compatible con Android, descarga la Plantilla para control de juegos de Android TV (ZIP). Incluye un archivo PNG y uno de Adobe® Illustrator® con un control blanco sobre un fondo negro y un control negro sobre fondo blanco (que se muestra en la figura 1).

Figura 1: Ejemplo de instrucciones del control con la plantilla para control de juegos de Android TV