Adopt System Caption Settings in Your App

Background

On Android TV, we provide settings for users to define their own caption style. Here is a sample app that gets the system provided caption style to apply it.

The caption options could be found under Settings > System > Accessibility > Caption like below:

ATV_Caption_Settings

How to get CaptionStyle from CaptioningManager

CaptioningManger is a public API. In activity, you can get the caption service from context

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

After that, you should also define the listeners if needed.

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

@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.backgroundOpcity = 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.windowOpcity = userStyle.windowColor >>> 24;
  currentCaptionStyle.hasEdgeColor = userStyle.hasEdgeColor();
  currentCaptionStyle.edgeColor = userStyle.edgeColor;
  currentCaptionStyle.hasEdgeType = userStyle.hasEdgeType();
  currentCaptionStyle.edgeType = userStyle.edgeType;
  currentCaptionStyle.typeFace = userStyle.getTypeface();
}
  });

When you need the system CaptionStyle, you can directly call

CaptionStyle systemCaptionStyle = captioningManager.getUserStyle();