Cómo adoptar la configuración de subtítulos del sistema

Android TV proporciona parámetros de configuración que permiten al usuario establecer las preferencias de subtítulos de forma centralizada para crear una experiencia coherente en las apps de contenido multimedia.

Estos parámetros de configuración permiten a los usuarios habilitar los subtítulos, seleccionar un idioma preferido y definir un estilo de subtítulos personalizado según sus necesidades. Los usuarios también pueden especificar si prefieren subtítulos simplificados con un nivel de lectura de tercer grado, conocidos como "Easy Reader".

En esta guía, se muestra cómo obtener y aplicar la configuración de subtítulos proporcionada por el sistema a los subtítulos de tu app.

Encuentra las opciones de subtítulos, incluida una vista previa del estilo de subtítulos seleccionado, en Configuración > Accesibilidad > Subtítulos:

El menú de configuración de subtítulos en Android TV.
Figura 1. Página de configuración de subtítulos

Obtén CaptioningManager

Desde una actividad, obtén el CaptioningManager servicio de Context:

CaptioningManager captioningManager = (CaptioningManager) context.getSystemService(Context.CAPTIONING_SERVICE);

Cómo controlar los cambios en la configuración de subtítulos

Para controlar los cambios en la configuración de subtítulos, implementa la CaptioningChangeListener clase:

if (captioningManager != null) {
  // Define a class to store the CaptionStyle details.
  CurrentCaptionStyle currentCaptionStyle = new CurrentCaptionStyle();
  // Define the listeners.
  captioningManager.addCaptioningChangeListener(new CaptioningChangeListener() {

    @Override
    public void onEnabledChanged(boolean enabled) {
      super.onEnabledChanged(enabled);
      Log.d(TAG, "onEnabledChanged");
      currentCaptionStyle.isEnabled = enabled;
    }

    @Override
    public void onLocaleChanged(@Nullable Locale locale) {
      super.onLocaleChanged(locale);
      Log.d(TAG, "onLocaleChanged");
      currentCaptionStyle.locale = locale;
      if (locale == null) {
        currentCaptionStyle.isEasyReaderEnabled = false;
      } else {
        currentCaptionStyle.isEasyReaderEnabled = locale.getVariant().contains("simple");
      }
    }

    @Override
    public void onFontScaleChanged(float fontScale) {
      super.onFontScaleChanged(fontScale);
      Log.d(TAG, "onFontScaleChanged");
      currentCaptionStyle.fontScale = fontScale;
    }

    @Override
    public void onUserStyleChanged(@NonNull CaptionStyle userStyle) {
      super.onUserStyleChanged(userStyle);
      Log.d(TAG, "onUserStyleChanged");
      currentCaptionStyle.hasBackgroundColor = userStyle.hasBackgroundColor();
      currentCaptionStyle.backgroundColor = userStyle.backgroundColor;
      currentCaptionStyle.backgroundOpacity = userStyle.backgroundColor >>> 24;
      currentCaptionStyle.hasForegroundColor = userStyle.hasForegroundColor();
      currentCaptionStyle.foregroundColor = userStyle.foregroundColor;
      currentCaptionStyle.foregroundOpacity = userStyle.foregroundColor >>> 24;
      currentCaptionStyle.hasWindowColor = userStyle.hasWindowColor();
      currentCaptionStyle.windowColor = userStyle.windowColor;
      currentCaptionStyle.windowOpacity = userStyle.windowColor >>> 24;
      currentCaptionStyle.hasEdgeColor = userStyle.hasEdgeColor();
      currentCaptionStyle.edgeColor = userStyle.edgeColor;
      currentCaptionStyle.hasEdgeType = userStyle.hasEdgeType();
      currentCaptionStyle.edgeType = userStyle.edgeType;
      currentCaptionStyle.typeFace = userStyle.getTypeface();
    }

  });
}

Como alternativa, llama al método getUserStyle directamente:

CaptionStyle systemCaptionStyle = captioningManager.getUserStyle();