开发者控制台

步骤4: 插入节目

步骤4: 插入节目

如果选择不集成Gracenote,则必须定期将您所有频道正在播放和即将播放的节目信息插入到Android电视数据库中。

构建并插入节目元数据

为了快速演示,您可以使用之前插入频道的频道ID进行一些节目元数据的硬编码,并将节目数据插入到数据库中。此代码位于SetupActivity.java

插入节目元数据的示例:

import androidx.tvprovider.media.tv.Program;
import android.content.ContentProviderOperation;
import java.util.ArrayList;
import android.os.RemoteException;
import android.content.OperationApplicationException;

private void insertPrograms(long channelId) {
    ArrayList < ContentProviderOperation > ops = new ArrayList < > ();

    long oneHourMs = 1000 * 60 * 60;

    Program testProgram = new Program.Builder()
        .setChannelId(channelId)
        .setTitle("My Test Program")
        .setStartTimeUtcMillis(System.currentTimeMillis()) //just a sample time to see program displayed
        .setEndTimeUtcMillis(System.currentTimeMillis() + oneHourMs)
        .build();

    ops.add(ContentProviderOperation
        .newInsert(TvContract.Programs.CONTENT_URI)
        .withValues(testProgram.toContentValues())
        .build());
    try {
        getApplicationContext().getContentResolver().applyBatch(TvContract.AUTHORITY, ops);
    } catch (RemoteException | OperationApplicationException e) {
        Log.e("SetupActivity", "Failed to insert programs.", e);
    }
}

如果是初次实现,随后可以在SetupActivity中添加对insertPrograms方法的调用。以下为完整方法示例:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.rich_setup);

    long channelId = insertChannel();
    insertPrograms(channelId);
}

说明:

  • 通过ContentResolver插入/更新/删除/查询节目元数据的方法与频道相同。
  • 以下是可提供的节目元数据完整列表。此外,请参阅获取节目元数据
  • 建议使用AndroidX支持库提供的节目模型来构建ContentValues。
  • 必须先为此值分配一个有效的频道ID,然后才能插入。频道ID应该是节目所属频道的唯一ID。
  • 请确保数据中不存在节目间隙或节目时间重叠现象。

检查点 - 在UI中显示节目元数据

  1. 在Fire TV中构建并安装您的APK。
  2. 导航到“Settings(设置)”>“Live TV(电视直播)”>“Sync Sources(同步来源)”,并选择您的输入。
  3. 导航到“On Now(正在播放)”行或“Live(直播)”选项卡。此时应该会显示当前正在播放节目的频道。
  4. 在“Live TV”选项卡中,导航到“Channel Guide(频道指南)”。此时应该会看到已插入的测试节目在测试频道播放。

故障排除

我没有看到浏览卡片(浏览时显示的内容框)中显示任何节目元数据

如果已集成Gracenote,请参阅“步骤3: 插入第一个频道”中的故障排除部分,对Gracenote ID进行鉴别。

如果没有集成Gracenote,请确保已插入节目的开始时间和结束时间在当前时间下都是有效的。

如果该时段内没有可用的节目元数据,则默认情况下将显示“Program Information Not available”文本。

验证日志中的以下内容:

  1. 已为该时段插入了节目元数据。
  2. 节目开始时间和结束时间没有与同一频道中之前或之后的节目重叠。Fire TV的频道指南设计为只处理不存在任何时间重叠现象的线性节目。

某一行之后的所有频道行均显示“Program Information Not available”

这通常是由于未完成节目元数据插入而导致的。可以通过日志进行验证。如果日志中没有节目信息,节目就不应该被插入。

导致未完成元数据插入的最常见原因是Android的JobScheduler超时。对于任何持续作业,Android的超时时间为10分钟(Lollipop上为1分钟)。这一点在JobScheduler文档中没有明确指出,但在WorkManager文档中有所提及(WorkManager可使用适用于Android API级别的JobScheduler潜在依赖项)。

典型的变通方式包括:

  • 减少插入的节目数据,以避免Android超时。每个频道的未来节目建议数量视具体情况而定,并且应该包含在功能讨论中。
  • 使用不同的同步作业,以较小数据块的形式插入节目数据。
  • 实现可靠的重试逻辑来处理超时问题。

后续步骤

转到下一步: 步骤5: 在Fire TV UI中播放