開発者コンソール

手順4: 番組を挿入する

手順4: 番組を挿入する

Gracenoteと統合しない場合は、すべてのチャンネルについて、現在放送中および今後放送予定の番組に関する情報をAndroidのTVデータベースに定期的に挿入する必要があります。

番組メタデータの作成と挿入

簡単なデモを行うために、既に挿入されているチャンネルのチャンネルIDを使用して一部の番組メタデータをハードコーディングし、番組データをデータベースに挿入できます。このコードはSetupActivityに記述します。

番組メタデータを挿入する例を以下に示します。

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()) //番組が表示されることを確認するためのサンプル時刻
        .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", "番組を挿入できませんでした。", e);
    }
}
private fun insertPrograms(channelId: Long) {
    val oneHourMs = (1000 * 60 * 60).toLong()
    val testProgram: Program = Program.Builder()
        .setChannelId(channelId)
        .setTitle("My Test Program")
        .setStartTimeUtcMillis(System.currentTimeMillis()) //番組が表示されることを確認するためのサンプル時刻
        .setEndTimeUtcMillis(System.currentTimeMillis() + oneHourMs)
        .build()
    val ops = arrayListOf(
    ContentProviderOperation
        .newInsert(TvContract.Programs.CONTENT_URI)
        .withValues(testProgram.toContentValues())
        .build())
    try {
        contentResolver.applyBatch(TvContract.AUTHORITY, ops)
    } catch (e: RemoteException) {
        Log.e("SetupActivity", "番組を挿入できませんでした。", e)
    } catch (e: OperationApplicationException) {
        Log.e("SetupActivity", "番組を挿入できませんでした。", e)
    }
}

初めて実装する場合は、SetupActivityにinsertProgramsメソッドの呼び出しを追加します。メソッド全体は次のようになります。

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

    long channelId = insertChannel();
    insertPrograms(channelId);
}
public override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.rich_setup)
    val channelId = insertChannel()
    if (channelId != null) {
        insertPrograms(channelId)
    }
}

注意事項:

  • 番組メタデータは、チャンネルの場合と同様に、ContentResolverを介して挿入、更新、削除、照会できます。
  • 指定できる番組メタデータの全一覧を確認してください。番組メタデータの取得も参照してください。
  • AndroidXサポートライブラリで提供されるProgramモデルを使用して、ContentValuesを作成することをお勧めします。
  • 挿入する前に、値に有効なチャンネルIDを割り当ててください。チャンネルIDは、番組が含まれるチャンネルの一意のIDである必要があります。
  • データ内に番組間の空白時間や番組時間の重複がないことを確認してください。

チェックポイント - UIでの番組メタデータの表示

  1. APKをビルドしてFire TVにインストールします。
  2. [設定] > [ライブTV] > [チャンネル提供元を同期] の順に選択し、入力を選択します。
  3. [放映中のチャンネル] 行または [ライブ] タブに移動します。現在放送中の番組があるチャンネルが表示されます。
  4. [ライブTV] タブで番組表に移動します。挿入したテスト番組がテストチャンネルで放送中になっています。

トラブルシューティング

閲覧カード(閲覧時に表示されるコンテンツボックス)に番組メタデータが表示されない

Gracenoteが統合されている場合は、「手順3: 最初のチャンネルを挿入する」の「トラブルシューティング」セクションを参照して、Gracenote IDを確認してください。

Gracenoteが統合されていない場合は、挿入した番組の開始時刻と終了時刻が現在の時刻に基づいて有効であることを確認してください。

「番組情報がありません」というテキストは、その時間帯の番組メタデータが存在しない場合にデフォルトテキストとして表示されます。

ログで以下を確認します。

  1. 該当する時間帯の番組メタデータが挿入されていること。
  2. 該当する番組の開始時刻と終了時刻が、同じチャンネルの前後の番組と重複していないこと。Fire TVの番組表は、時間の重複がない状態でリニア番組を処理するように設計されています。

特定の行の後にあるすべてのチャンネル行に「番組情報がありません」が表示される

この問題は通常、番組メタデータの挿入が不完全である場合に発生します。これはログを使用して確認できます。番組情報がない状態で番組が挿入されないようにする必要があります。

メタデータの挿入が不完全になる原因として最も多いのが、AndroidのJobSchedulerのタイムアウトです。Androidでは、進行中のジョブは10分(Lollipopでは1分)でタイムアウトします。これは、JobSchedulerのドキュメントには明記されていませんが、WorkManagerのドキュメント(AndroidのAPIレベルに応じてJobSchedulerの基本的な依存関係を使用できます)には記載されています。

一般的な回避策は次のとおりです。

  • Androidのタイムアウトが発生しないように、挿入する番組データを少なくする。チャンネルごとに推奨される今後の番組数は状況に応じて異なるため、機能の検討事項の1つとして含める必要があります。
  • 異なる同期ジョブを使用して、番組データを小さなチャンクで挿入する。
  • タイムアウトのケースを処理する堅牢な再試行ロジックを実装する。

次のステップ

次の 手順5: Fire TVのUIで再生するに進みます。


Last updated: 2022年8月12日