步骤4: 插入节目
步骤4: 插入节目
重要须知: 具有有效Gracenote ID的频道无需提供其他节目信息,便可接收完整的节目元数据。如果使用Gracenote时无法看到全部正确元数据,请联系您的Gracenote联系人以寻求解决方法。如果您正在使用Gracenote,请跳过此页面。
如果选择不集成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。
- 请确保数据中不存在节目间隙或节目时间重叠现象。
注意: 作为最佳实践,您应该全权负责确保始终向Android电视数据库添加准确的节目数据。
检查点 - 在UI中显示节目元数据
- 在Fire TV中构建并安装您的APK。
- 导航到“Settings(设置)”>“Live TV(电视直播)”>“Sync Sources(同步来源)”,并选择您的输入。
- 导航到“On Now(正在播放)”行或“Live(直播)”选项卡。此时应该会显示当前正在播放节目的频道。
- 在“Live TV”选项卡中,导航到“Channel Guide(频道指南)”。此时应该会看到已插入的测试节目在测试频道播放。
故障排除
我没有看到浏览卡片(浏览时显示的内容框)中显示任何节目元数据
如果已集成Gracenote,请参阅“步骤3: 插入第一个频道”中的故障排除部分,对Gracenote ID进行鉴别。
如果没有集成Gracenote,请确保已插入节目的开始时间和结束时间在当前时间下都是有效的。
我看到“Channel Guide(频道指南)”中的磁贴(与浏览卡片类似,但并非轮播)显示“Program Information Not available”(节目信息不可用)
如果该时段内没有可用的节目元数据,则默认情况下将显示“Program Information Not available”文本。
验证日志中的以下内容:
- 已为该时段插入了节目元数据。
- 节目开始时间和结束时间没有与同一频道中之前或之后的节目重叠。Fire TV的频道指南设计为只处理不存在任何时间重叠现象的线性节目。
某一行之后的所有频道行均显示“Program Information Not available”
这通常是由于未完成节目元数据插入而导致的。可以通过日志进行验证。如果日志中没有节目信息,节目就不应该被插入。
导致未完成元数据插入的最常见原因是Android的JobScheduler超时。对于任何持续作业,Android的超时时间为10分钟(Lollipop上为1分钟)。这一点在JobScheduler文档中没有明确指出,但在WorkManager文档中有所提及(WorkManager可使用适用于Android API级别的JobScheduler潜在依赖项)。
典型的变通方式包括:
- 减少插入的节目数据,以避免Android超时。每个频道的未来节目建议数量视具体情况而定,并且应该包含在功能讨论中。
- 使用不同的同步作业,以较小数据块的形式插入节目数据。
- 实现可靠的重试逻辑来处理超时问题。
注意: 可以参考以下资源来查询Android电视数据库中的现有频道或节目。
后续步骤
转到下一步: 步骤5: 在Fire TV UI中播放。