Cómo personalizar la app de TV de referencia

TV en vivo es una app de referencia diseñada para dispositivos de TV con Android. Sin embargo, es posible que los fabricantes de dispositivos deseen agregar más funciones específicas del producto, que no se incluyen en la implementación predeterminada de la TV en vivo, como el ajuste de imagen, el modo de juego o el modo 3D. Para admitir estas funciones o opciones específicas del dispositivo, la TV en vivo admite estas personalizaciones:

  • Habilita el modo de pausa en directo, que permite a los usuarios pausar, adelantar y retroceder. Configurar el modo de cambio de hora para usar almacenamiento externo en lugar de almacenamiento interno
  • Se agregaron opciones a la fila de opciones de TV.
  • Agrega una fila personalizada y agrega opciones en ella.

Nota: Canales en vivo es la implementación de TV en vivo de Google que se puede usar tal como está en dispositivos con servicios de Google. Para personalizar los canales en vivo, reemplaza com.android.tv.* por com.google.android.tv.* en estas instrucciones.

Cómo personalizar la TV en vivo

Para personalizar la TV en vivo, el dispositivo Android TV de destino debe tener instalado un paquete de personalización, que debe ser una app del sistema precompilada con el permiso com.android.tv.permission.CUSTOMIZE_TV_APP.

La TV en vivo busca un paquete del sistema con este permiso, verifica los archivos de recursos y detecta las actividades del paquete marcadas con categorías específicas para procesar la personalización.

Punto clave: Solo un paquete puede personalizar la TV en vivo.

Cómo configurar el modo de cambio de hora

La pausa en directo (trickplay) permite que los dispositivos de TV con Android pausen, retrocedan y adelanten la reproducción de canales. En la implementación de TV en vivo, se puede usar la pausa en directo a través de la IU de Controles de reproducción. El cambio de hora está habilitado de forma predeterminada en la TV en vivo, pero se puede inhabilitar. El cambio de hora también se puede configurar para usar solo almacenamiento externo.

Para configurar el cambio de hora, agrega el recurso de cadena trickplay_mode y establece su valor en una de estas opciones:

  • enabled: Habilita la pausa en directo. Este es el valor predeterminado cuando no se proporcionan opciones.
  • disabled: Inhabilita el cambio de hora.
  • use_external_storage_only: Configura el cambio de hora para usar el almacenamiento externo.
<string name="trickplay_mode">use_external_storage_only</string>
La IU de los controles de juego se activa después de presionar el botón central del pad direccional.

Figura 1. La IU de los Controles de juego se activa después de presionar el botón central del mando de dirección.

Cómo personalizar las opciones de la TV

Los fabricantes de dispositivos pueden agregar opciones personalizadas para la configuración de TV en vivo al menú de opciones de TV existente, como agregar un atajo a la configuración de imagen y sonido.

Para indicar una opción personalizada, declara un filtro de intents que filtre la categoría com.android.tv.category.OPTIONS_ROW en una actividad. El fabricante del dispositivo implementa la función personalizada en la actividad. La actividad se inicia si se hace clic en la opción. El título y el ícono de la actividad se usan para la opción. Las opciones de TV personalizadas deben coincidir con la IU existente para brindar la mejor experiencia del usuario.

Nota: Una actividad solo puede controlar una opción porque Live TV no puede diferenciar los filtros de intents en una actividad con la misma categoría debido a la limitación de Android. Consulta Cómo controlar varias opciones en una actividad para obtener una solución.

Los fabricantes de dispositivos también pueden colocar una opción personalizada antes o después de las opciones existentes si definen android:priority en AndroidManifest.xml. Una opción con un valor de prioridad definido inferior a 100 se muestra antes de los elementos existentes, y un valor superior a 100 se muestra después. Varias opciones personalizadas (antes o después de las opciones existentes) se ordenan según su prioridad en orden ascendente. Si las opciones tienen la misma prioridad, el orden entre ellas no está definido.

En este ejemplo, la opción aparece primero en la fila de opciones de TV y se inicia PictureSettingsActivity si se hace clic en la opción.

<activity android:name=".PictureSettingsActivity"
    android:label="@string/activity_label_picture_settings"
          android:theme="@style/Theme.Panel">
    <intent-filter
        android:icon="@drawable/ic_tvoptions_brightness"
        android:label="@string/option_label_brightness"
        android:priority="0">
        <action android:name="android.intent.action.MAIN" />
        <category android:name="com.android.tv.category.OPTIONS_ROW" />
    </intent-filter>
</activity>

Ejemplo de fila de opciones de TV personalizadas

Figura 2. Ejemplo de fila de opciones de TV personalizadas (Brillo y ahorro de energía)

Ejemplos de opciones de TV personalizadas.

Figura 3. Ejemplos de opciones de TV personalizadas.

Cómo controlar varias opciones en una actividad

Una opción se asigna al filtro de intents de una actividad y viceversa. Debido a que Android no diferencia los filtros de intents con las mismas categorías y acciones, una actividad solo controla una opción, incluso si se declaran varios filtros de intents en ella. Para controlar varias opciones en una actividad, usa <activity-alias> en AndroidManifest.xml. En la actividad, usa getIntent().getComponent() para identificar la opción en la que se hizo clic.

<activity-alias android:name=".AnyUniqueName"
    android:targetActivity=".PictureSettingsActivity">
    <intent-filter
        android:icon="@drawable/ic_tvoptions_energy_saving"
        android:label="@string/option_label_energy_saving"
        android:priority="1">
        <action android:name="android.intent.action.MAIN" />
        <category android:name="com.android.tv.category.OPTIONS_ROW" />
    </intent-filter>
</activity-alias>

Crea una fila personalizada

Los fabricantes de dispositivos pueden agregar y personalizar una fila sobre la fila de opciones de la TV. Esta fila personalizada es opcional.

Título de la fila

Define una cadena partner_row_title en res/values/strings.xml. El valor de la cadena se usa para el título de la fila personalizado.

<string name="partner_row_title">Partner Row</string>

Opciones personalizadas

Para agregar opciones personalizadas a la fila personalizada, sigue el proceso para agregar opciones al menú de opciones de TV, pero cambia el nombre de la categoría a com.android.tv.category.PARTNER_ROW.

<activity android:name=".ThreeDimensionalSettingDialogActivity"
    android:label="@string/activity_label_3d"
    android:theme="@android:style/Theme.Material.Light.Dialog">
    <intent-filter
        android:icon="@drawable/ic_tvoptions_3d"
        android:priority="0">
        <action android:name="android.intent.action.MAIN" />
        <category android:name="com.android.tv.category.PARTNER_ROW" />
    </intent-filter>
</activity>

Ejemplo de fila personalizada opcional.

Figura 4. Ejemplo de fila personalizada opcional.

Ejemplo de diálogo de opción personalizada.

Figura 5. Ejemplo de diálogo de opción personalizada.