ライブTVのリソース
以下のベストプラクティスやコードサンプルなどの参考資料は、実装フェーズにおけるライブTV統合の詳細を理解するうえで役に立ちます。
許可リストへのパッケージの追加
許可リストによって、Fire TVの閲覧/検索時にチャンネルを表示できるアプリが決まります。
デバイスシリアル番号(DSN)のリストをAmazonの担当者と共有し、公開前にデバイスで要件を統合および検証できるようにする必要があります。
ベストプラクティス
以下は、Fire TVで快適なライブTVエクスペリエンスを提供するのに役立つ製品および実装のガイドラインです。
- 簡単に登録できるようにして、適宜トライアルを促す。たとえば、アプリの登録フォームを簡素化したり、登録に電話番号を利用したりします。
- チャンネルラインナップの
TvContract.Channels.Logo
には、透明なモノクロロゴを使用する。 - ディープリンクフローを最適化して、全画面再生を2.5秒以内に開始する。
- 複数のチャンネルを操作しているときは常に一括アクションを使用する。
- 必要に応じてGracenoteチャンネルIDを活用し、統合を簡素化する。
- 完全なスケジュールを提供することや推奨される画像サイズを使用することよりも、メタデータ読み込みのパフォーマンスの最適化に重点を置く。
JobScheduler
またはWorkManager
を使用して、視聴権限が適切であることを定期的に確認する。これにより、アプリがフォアグラウンドで実行されていなくても、閲覧/検索されるチャンネルが視聴権限のあるチャンネルと常に同期されるようになります。- カスタムのチャンネル順序が使用されている場合を除き、視聴権限のあるチャンネルのリストが一部だけ変更された場合は、すべてのチャンネルを削除して再度追加するのではなく、必要な部分を更新するようにする。
COLUMN_DISPLAY_NAME
列に表示可能なチャンネル名を指定する(UIでフォールバックとして使用されることがあるため)。Fire TVでは、最大16文字の英数字または8~10文字の全角文字が表示されます。
コードサンプル
このセクションには、ライブTVの統合に関連するコードサンプルが記載されています。
Gracenote IDで特定されたチャンネルに再生ディープリンクを設定する方法
次のコードはTVContractUtils.javaから抜粋したもので、Gracenote IDとディープリンクをTVデータベースに挿入する方法を示しています。
/**
* 外部IDのタイプを格納する変数。サービスメタデータのマッチングに使用されます。有効なタイプは
* 「EXTERNAL_ID_TYPE_」で始まる名前の定数として以下で定義されます
* Nullまたは無効なデータを使用すると、サービスメタデータの
* マッチングに失敗します
*/
private final static String EXTERNAL_ID_TYPE = "externalIdType";
/**
* 外部IDの値を格納する変数。サービスメタデータのマッチングに使用されます。
* Nullまたは無効なデータを使用すると、サービスメタデータのマッチングに失敗します
*/
private final static String EXTERNAL_ID_VALUE = "externalIdValue";
/**
* 外部プレーヤーへの再生のディープリンクURI。
* Nullまたは無効なデータを入力すると、Fire TVのネイティブプレイヤーとの統合がデフォルトとなります
*/
private final static String PLAYBACK_DEEP_LINK_URI = "playbackDeepLinkUri";
// Gracenote入力タイプのID
private final static String GRACENOTE_ID = "gracenote_ontv"; // gracenote ontv id
private final static String GRACENOTE_GVD = "gracenote_gvd"; // gracenote gvd id
// 再生のディープリンクURIのコントラクト
// Intent.URI_INTENT_SCHEMEを使用して、インテントからURIを作成したり、URIを元のインテントに戻したりします
Intent playbackDeepLinkIntent = new Intent(); // アプリで作成されます
String playbackDeepLinkUri = playbackDeepLinkIntent.toUri(Intent.URI_INTENT_SCHEME);
// BLOBを作成します
ContentValues values = new ContentValues(); // すべてのチャンネルデータを格納します
ContentResolver resolver = context.getContentResolver();
values.put(TvContract.Channels.COLUMN_DISPLAY_NAME, "<実際の表示名>");
values.put(TvContract.Channels.COLUMN_INPUT_ID, "<実際の入力ID>");
try {
String jsonString = new JSONObject()
.put(EXTERNAL_ID_TYPE, "<実際のIDタイプ>") // GRACENOTE_XXXに置き換えます
.put(EXTERNAL_ID_VALUE, "<実際のID値>") // チャンネルに関連付けられたGracenote ID値に置き換えます
.put(PLAYBACK_DEEP_LINK_URI, playbackDeepLinkUri).toString();
values.put(TvContract.Channels.COLUMN_INTERNAL_PROVIDER_DATA, jsonString.getBytes());
} catch (JSONException e) {
Log.e(TAG, "BLOBにデータを追加するときにエラーが発生しました " + e);
}
Uri uri = resolver.insert(TvContract.Channels.CONTENT_URI, values);
ペアレンタルコントロールの実装方法
次のコードは、ペアレンタルコントロールをリッスンし、ライブプレビューまたはネイティブの全画面再生を開始する方法を示しています。
private TvContentRating mBlockedRating = null;
@Override
public boolean onTune(final Uri channelUri) {
...
if (mTvInputManager.isParentalControlsEnabled()) {
// サーフェスで音声や画像が再生されないようにします
mBlockedRating = <content_rating>;
//1.全画面再生のときに、ユーザーにPINの入力を求めるプロンプトを表示します
//2.[放映中のチャンネル] 行を閲覧しているときに
// 番組画像が再生サーフェスで表示されないようにします
notifyContentBlocked(mBlockedRating);
} else {
// 再生が開始されます
notifyContentAllowed();
}
...
}
@Override
public void onUnblockContent(final TvContentRating unblockedRating) {
// ユーザーのPIN入力により、指定のレーティングに該当するコンテンツのブロックが
// 正常に解除されました
if (unblockedRating.unblockContent(mBlockedRating)) {
// 再生が開始されます
notifyContentAllowed();
}
}
アプリバナーの提供
ライブTVの設定でアプリバナーを表示するには、パッケージマネージャーを使用してアプリバナーを提供する必要があります。
// AndroidManifest.xml内
<application
android:allowBackup="false"
android:label="@string/app_name"
android:banner="@drawable/app_icon_banner"
tools:replace="android:allowBackup, allow:label, android:theme" >
<meta-data
android:name="****"
android:value="true"
/>
</application>
バナーをテストするには、次のコードスニペットを参照してください。
Drawable appDrawable = null;
try {
String packageName = "****"; // ****を実際のパッケージ名に置き換えます
PackageManager packageManager = getContext().getPackageManager();
appDrawable = packageManager.getApplicationBanner(packageName);
} catch (PackageManager.NameNotFoundException e) {
Log.i(TAG, "パッケージのアプリバナーが見つかりません:" + packageName);
}
ライブTV対応サンプルアプリ
ライブTVが統合されたサンプルアプリは、GitHub(github.com/amzn/ftv-livetv-sample-tv-app)で入手できます。このライブTV対応サンプルアプリは、GoogleのサンプルTVアプリをベースとしています。Fire TVへのライブTV統合のリファレンスとして、このサンプルアプリを使用できます。
サンプルアプリがサポートされるロケールは、 US、CA、UK、DE、JP、ES、INのみです。その他マーケットプレイスでのサポートは間もなく開始されます。
サンプルアプリを読み込むには、以下の手順を実行します。
-
https://github.com/amzn/ftv-livetv-sample-tv-appにアクセスして、[Clone or download] をクリックし、[Download ZIP] をクリックします。ダウンロードファイルを解凍します。
ライブTVを統合するためのサンプルコードがアプリに表示されます。結果を確認するには、次の手順で説明するように、ADBを使用してapp-debug.apkファイルをFire TVにサイドロードします。
-
既にデバッグが有効でADBがインストールされている場合は、[設定] > [デバイスとソフトウェア](または [My Fire TV])> [バージョン情報] > [ネットワーク] からFire TVのIPアドレスを取得し、以下を実行してFire TVのIPアドレスをカスタマイズします。
adb connect 123.456.7.89:5555
123.456.7.89をFire TVのIPアドレスに置き換えてください(コンピューターはFire TVと同じWi-Fiネットワーク上にある必要があるため、企業のVPNを利用していて接続に問題がある場合は、VPNから切断してみてください)。
-
ビルドされたAPKをサンプルアプリにインストールします。
adb install -r AndroidTvSampleInput/app/build/outputs/apk/app-debug.apk
レスポンスは次のとおりです。
Performing Streamed Install Success
なお、このサンプルアプリは、本来、スタンドアロンのアプリとして起動するものではありません。その代わり、Fire TVデバイスで利用できるライブTVチャンネルのコードが組み込まれています。
-
Fire TVデバイスで、[設定] > [アプリケーション] > [インストール済みアプリケーションを管理] の順に移動します。[Sample TV Inputs] を選択します。[アプリを起動] をクリックします。
Sample TV Inputs Amazon開発者ポータルが表示されます。
Amazon Fire TVサイト -
Fire TVリモコンのホームボタンを押して、この画面から戻ります。次に、[設定] > [ライブTV] > [チャンネル提供元を同期] > [Amazon Sample TV Input] の順にクリックします。
サンプルチャンネルが読み込まれます。
チャンネル提供元の同期 -
同期が完了したら、ホームボタンを押します。これで、チャンネルが [放映中のチャンネル] 行と番組表に表示されるはずです。
[放映中のチャンネル] 行は次のようになります。
Fire TVの [放映中のチャンネル] 行 番組表は次のようになります。
Fire TV番組表 Fire TVの番組表に移動するには、ホーム画面に移動して、[放映中のチャンネル] 行まで下にスクロールし、リモコンのメニューボタンを押してから [番組表] をクリックします。リモコンのマイクボタンを押して「番組表」と言う方法もあります。
認定チェックリスト
Amazonは、以下のチェックリストを使用して、ライブTVが統合されたアプリを認定します。アプリの実装が直接関係する動作ポイントは次のとおりです。また、認定の例外は、状況に応じた対応となります。
権限状態の変更
- ユーザーが次のいずれかを実行すると、視聴権限のあるチャンネルがFire TVのUIに表示されます([放送中のチャンネル] 行、チャンネルガイドなど)。 (1)アプリを開いてサインインする。(2)[設定] > [放送中のチャンネル] > [チャンネル提供元を同期] > <アプリ名>からアプリの設定ページにアクセスする。
- ユーザーのメンバーシップ期限が切れた場合(つまり、「視聴権限がなくなった」場合)、ユーザーがチャンネルにアクセスしてペイウォールに到達し、オファーをキャンセルまたは拒否するまで、チャンネルはFire TVのUIに表示され続けます。
- チャンネルは、アプリがアンインストールされたとき、またはチャンネルの視聴権限が無効になったときに、Fire TVのUIから削除されます。
閲覧と再生
- ユーザーがチャンネルにフォーカスすると、詳細なメタデータが提供されます。リニアTVガイドに表示されるチャンネルには、チャンネルのロゴ、チャンネル番号(オプション)、今後14日間のスケジュール情報が含まれます。番組のメタデータには、番組名、再生時間、エピソード名、エピソードの詳細な説明、シーズンとエピソードの情報、字幕、番組のレーティング画像(16:9)、背景画像(16:9)が含まれます。このメタデータ情報は、Gracenoteのマッチング、またはTVコントラクトの一部としてプッシュされるメタデータから提供されます。
- ユーザーが [放映中のチャンネル] 行のチャンネルにフォーカスすると、背景画像に代わってライブチャンネルのプレビューが表示されます。
- ユーザーは、視聴権限のあるこのチャンネルの提供元を把握できる必要があります。このため、背景画像(モノクロ、高さ34px)の一部として、またはライブチャンネルプレビューの再生前のスプラッシュ画面として、プロバイダーアトリビューションを追加します。
- ユーザーがチャンネルを選択すると、全画面再生が開始されます。[戻る] ボタンを押すと、Fire TVのUIに戻ります。
- ペアレンタルコントロール(PCON)が有効になっている場合、再生前にPINの入力を求めるプロンプトが表示されます。PCONが有効になっている場合は、ライブチャンネルプレビューを無効にする必要があります。
- Alexaにアクセスする場合は、再生するライブコンテンツの音量を下げます(ビデオは続行されます)。
- PCONが有効になっている場合、再生前にPINの入力を求めるプロンプトが表示されます。PCONが有効になっている場合は、ライブチャンネルプレビューを無効にする必要があります。
- Alexaにアクセスする場合は、再生するライブコンテンツの音声をミュートする必要があります。ビデオは続行されます。
- (任意)ジャンルをチャンネルに割り当てることができます。この場合、Fire TV UIの追加入力ポイントでチャンネルが表示されます。
開発、ステージング、デプロイ
- 本番環境に進む前に、Amazonが特定のアカウントを許可リストに登録して、統合されたエクスペリエンスを確認および認定できる必要があります。
- 視聴権限のあるチャンネルのみが、両者がリリースに同意したマーケットプレイスのFire TV UIに追加されます。その後、別のマーケットプレイスでリリースする際には、新しい認定レビューとして扱われ、許可リストへの登録が必要となります。
- リリース後に追加または削除されるチャンネルはすべて、Amazonが把握する必要があります。追加されるチャンネルの上限については、両者の合意が必要です。
- (強く推奨)アプリのダウンロードページとリリースノートには、ユーザーがFire TVで利用可能な新機能を把握できるように、ライブTVの統合について記載してください。