自定义参考 TV 应用

Live TV 是专为 Android 电视设备设计的参考 TV 应用。不过,设备制造商可能会想要添加更多不在 Live TV 默认实现范围内的产品专属功能,例如照片调整、游戏模式或 3D 模式。为了支持这些设备专属功能或选项,Live TV 支持进行以下自定义:

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

注意直播频道是 Google 实现的 Live TV 实例,用户可以在设备上通过 Google 服务原样使用它。对直播频道进行自定义的操作步骤与以下说明相同,但需要将 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>
按方向键中间的按钮后,启用了播放控制界面。

图 1. 按方向键中间的按钮后,启用了播放控制界面。

对电视选项进行自定义

设备制造商可以将 Live TV 设置所对应的自定义选项添加到现有的电视选项菜单中,例如将一个快捷方式添加到“声音图像”设置中。

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

注意:一个 activity 只能处理一个选项,这是因为,由于 Android 限制,Live TV 无法区分 activity 中具有相同类别的 intent 过滤器。请参阅在一个 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>

自定义的电视选项行示例

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

自定义电视选项示例。

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

在一个 activity 中处理多个选项

一个选项对应于一个 activity 的 intent 过滤器,反之亦然。由于 Android 不会区分具有相同类别和操作的 intent 过滤器,因此一个 activity 只能处理一个选项,即使在其中声明了多个 intent 过滤器也是如此。如要在一个 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>

可选自定义行示例。

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

自定义选项对话框示例。

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