自定义参考 TV 应用

Live TV 是一款参考 TV 应用,专为 Android 电视设备设计。但是,设备制造商可能希望添加更多特定于产品的功能,这些功能不在 Live TV 的默认实现范围内,例如图像调整、游戏模式或 3D 模式。为了支持这些特定于设备的功能或选项,Live TV 支持以下自定义功能

  • 启用时移模式,允许用户暂停、快进和倒退。将时移模式配置为使用外部存储而非内部存储。
  • 在“电视选项”行中添加选项。
  • 添加自定义行并在其中添加选项。

注意Live Channels 是 Google 对 Live TV 的实现,可以在搭载 Google 服务的设备上按原样使用。要自定义 Live Channels,请在这些说明中将 com.android.tv.* 替换为 com.google.android.tv.*

自定义 Live TV

要自定义 Live TV,目标 Android TV 设备需要安装自定义软件包,该软件包必须是具有 com.android.tv.permission.CUSTOMIZE_TV_APP 权限的预构建系统应用。

Live TV 搜索具有此权限的系统软件包,检查资源文件,并检测使用特定Activity标记的软件包的 类别以处理自定义。

要点:只有一个软件包可以自定义 Live TV。

配置时移模式

时移(特技播放)允许 Android 电视设备暂停、倒退和快进频道播放。在 Live TV 实现中,可以通过播放控件界面使用时移。默认情况下,Live TV 中启用时移,但可以禁用。还可以将时移配置为仅使用外部存储。

要配置时移,请添加字符串资源 trickplay_mode 并将其值设置为以下选项之一

  • enabled:启用时移。这是未提供任何选项时的默认值。
  • disabled:禁用时移。
  • use_external_storage_only:配置时移以使用外部存储。
<string name="trickplay_mode">use_external_storage_only</string>
Play controls UI is activated after
pressing the D-pad center button.

图 1. 按下 D-pad 中心按钮后,播放控件界面即会激活。

自定义电视选项

设备制造商可以为 Live TV 设置的现有“电视选项”菜单添加自定义选项,例如添加指向“声音图像”设置的快捷方式。

要指示自定义选项,请声明一个 intent-filter,该 intent-filter 在 activity 中过滤类别 com.android.tv.category.OPTIONS_ROW。自定义功能由设备制造商在 activity 中实现。如果点击该选项,则会启动 activity。activity 的标题和图标用于该选项。自定义的电视选项应与现有界面匹配,以提供最佳用户体验。

注意:一个 activity 只能处理一个选项,因为由于 Android 限制,Live TV 无法区分具有相同类别的 activity 中的 intent-filter。请参阅在一个 activity 中处理多个选项以了解解决方法。

设备制造商还可以通过在 AndroidManifest.xml 中定义 android:priority,将自定义选项放置在现有选项之前或之后。优先级值低于 100 的选项显示在现有项目之前,值高于 100 的选项显示在之后。多个自定义选项(在现有选项之前或之后)按优先级升序排序。如果选项具有相同的优先级,则它们之间的顺序未定义。

在此示例中,该选项首先出现在“电视选项”行中,如果点击该选项,则会启动 PictureSettingsActivity。

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

Sample customized TV options row

图 2. 自定义的“电视选项”行示例(“亮度”和“节能”)。

Sample custom TV options.

图 3. 自定义电视选项示例。

在一个 activity 中处理多个选项

一个选项映射到一个 activity 的 intent-filter,反之亦然。由于 Android 不区分具有相同类别和操作的 intent-filter,因此即使在一个 activity 中声明了多个 intent-filter,一个 activity 也只能处理一个选项。要在 activity 中处理多个选项,请在 AndroidManifest.xml 中使用 <activity-alias>。在 activity 中,使用 getIntent().getComponent() 来识别点击的选项。

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

创建自定义行

设备制造商可以在“电视选项”行上方添加和自定义行。此自定义行是可选的。

行标题

res/values/strings.xml 中定义 partner_row_title 字符串。该字符串的值用作自定义行标题。

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

自定义选项

要将自定义选项添加到自定义行,请按照向“电视选项”菜单添加选项的流程,但将类别名称更改为 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>

Sample optional custom row.

图 4. 可选的自定义行示例。

Sample custom option dialog.

图 5. 自定义选项对话框示例。