リファレンス TV アプリをカスタマイズする

ライブテレビは、Android TV デバイス向けに設計されたリファレンス TV アプリです。ただし、デバイス メーカーは、ライブテレビのデフォルト実装ではカバーされない、製品固有の機能(画像の調整、ゲームモード、3D モードなど)を追加することが必要な場合があります。ライブテレビでは、こうしたデバイス固有の機能やオプションをサポートするために、次のカスタマイズがサポートされています。

  • タイムシフト モードを有効にする(ユーザーは一時停止、早送り、巻き戻しができるようになる)。内部ストレージの代わりに外部ストレージを使用するタイムシフト モードを設定する
  • テレビのオプション行にオプションを追加する
  • カスタム行を追加し、そこにオプションを追加する

: ライブ チャンネルは Google によるライブテレビの実装であり、Google サービスを搭載したデバイスでそのまま使用できます。ライブ チャンネルをカスタマイズするには、この手順で com.android.tv.*com.google.android.tv.* に置き換えます。

ライブテレビのカスタマイズ

ライブテレビをカスタマイズするには、対象とする Android TV デバイスにカスタマイズ パッケージをインストールする必要があります。このパッケージは、com.android.tv.permission.CUSTOMIZE_TV_APP 権限を持つビルド済みのシステムアプリでなければなりません。

ライブテレビはこの権限を使用してシステム パッケージを検索し、リソース ファイルを確認して、カスタマイズ処理のために特定のカテゴリでマークされたパッケージのアクティビティを検出します。

重要なポイント: ライブテレビをカスタマイズできるのは 1 つのパッケージのみです。

タイムシフト モードの設定

タイムシフト(トリックプレイ)により、Android TV デバイスでチャンネルの再生を一時停止、巻き戻し、早送りできます。ライブテレビの実装では、再生コントロール UI を介してタイムシフトを使用できます。ライブテレビでは、タイムシフトはデフォルトで有効になっていますが、無効にすることもできます。タイムシフトは、外部ストレージのみを使用するように設定することもできます。

タイムシフトを設定するには、文字列リソース trickplay_mode を追加し、その値を次のいずれかに設定します。

  • enabled: タイムシフトを有効にします。これは、オプションが指定されていない場合のデフォルト値です。
  • disabled: タイムシフトを無効にします。
  • use_external_storage_only: 外部ストレージを使用するようにタイムシフトを設定します。
<string name="trickplay_mode">use_external_storage_only</string>
再生コントロール UI は、D-pad の中央ボタンを押すと有効になります。

図 1. 再生コントロール UI は、D-pad の中央ボタンを押すと有効になります。

テレビのオプションのカスタマイズ

デバイス メーカーは、音声と画像の設定へのショートカットを追加するなど、ライブテレビ設定のカスタム オプションを既存のテレビ オプション メニューに追加できます。

カスタム オプションを指定するには、アクティビティ内のカテゴリ com.android.tv.category.OPTIONS_ROW をフィルタするインテント フィルタを宣言します。カスタム機能は、デバイス メーカーがアクティビティに実装したものです。オプションをクリックするとアクティビティが開始されます。このアクティビティのタイトルとアイコンがオプションに使用されます。ユーザー エクスペリエンスを最大限に高めるため、既存の UI に合わせてテレビ オプションをカスタマイズする必要があります。

: Android の制限により、ライブテレビは同じカテゴリであるアクティビティ内のインテント フィルタを区別できないため、アクティビティでは 1 つのオプションしか処理できません。回避策については、1 つのアクティビティで複数のオプションを処理するをご覧ください。

デバイス メーカーは、AndroidManifest.xmlandroid: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. テレビのカスタム オプションの例。

1 つのアクティビティで複数のオプションを処理する

オプションはアクティビティのインテント フィルタにマッピングされており、その逆も同様です。Android は、同じカテゴリとアクションのインテント フィルタを区別しないため、アクティビティで複数のインテント フィルタが宣言されている場合でも、1 つのオプションしか処理しません。アクティビティで複数のオプションを処理するには、AndroidManifest.xml<activity-alias> を使用します。アクティビティで、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.xmlpartner_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. カスタム オプション ダイアログの例。