TV の録画機能

TV の入力サービスを使用すると、ユーザーは time-shifting API を介してチャンネルの再生を一時停止および再開できます。 Android N では、録画したセッションを複数保存できるようにして、タイムシフティング機能を拡張しています。

ユーザーはあらかじめ録画をスケジュールできます。また、プログラムを視聴しながら録画を開始することもできます。 システムが録画を保存すると、システムの TV アプリで録画をブラウジング、管理、再生できます。

TV 入力サービスで録画機能を提供する場合は、アプリが録画をサポートしていることをシステムに示し、プログラムの録画機能を実装し、録画中に発生したエラーを処理および通知し、録画したセッションを管理する必要があります。

注:ライブチャンネル アプリでは、録画を作成したり録画にアクセスするための機能はまだ提供されていません。 ライブチャンネル アプリに変更が行われるまで、TV 入力サービスの録画機能を完全にテストすることは難しい場合があります。

録画のサポートを示す

TV 入力サービスで録画をサポートしていることをシステムに示すには、サービス メタデータ XML ファイル内の android:canRecord 属性を true に設定します。

<tv-input xmlns:android="http://schemas.android.com/apk/res/android"
  android:canRecord="true"
  android:setupActivity="com.example.sampletvinput.SampleTvInputSetupActivity" />

サービス メタデータ ファイルの詳細については、マニフェストで TV 入力サービスを宣言するをご覧ください。

また、以下のステップを使用して、コードで録画機能のサポートを示すことができます。

  1. TvInputService.onCreate() メソッドで、TvInputInfo.Builder クラスを使用して新しい TvInputInfo オブジェクトを作成します。
  2. 新しい TvInputInfo オブジェクトを作成するときは、 setCanRecord(true) を呼び出してから、build() を呼び出して、サービスが録画をサポートしていることを示します。
  3. TvInputManager.updateTvInputInfo() を呼び出してシステムに TvInputInfo オブジェクトを登録します。

セッションを録画する

TV 入力サービスで録画機能のサポートを登録した後、システムがアプリの録画機能の実装にアクセスする必要があるときに、 TvInputService.onCreateRecordingSession() を呼び出します。 独自の TvInputService.RecordingSession サブクラスを実装し、onCreateRecordingSession() コールバックが発生したときに返します。 このサブクラスは、正しいチャンネル データへの切り替え、要求されたデータの録画、録画のステータスおよびエラーのシステムへの通知を処理します。

システムが RecordingSession.onTune() を呼び出すと、チャンネル URI を渡して、URI で指定されたチャンネルに合わせます。 notifyTuned() を呼び出して、アプリが目的のチャンネルに合わせたことをシステムに通知します。または、アプリが適切なチャンネルに合わせることができなかった場合は、 notifyError() を呼び出します。

次に、システムは RecordingSession.onStartRecording() コールバックを呼び出します。 アプリは直ちに録画を開始する必要があります。システムはこのコールバックを呼び出すときに、これから録画するプログラムに関する情報を含む URI を提供します。 録画が完了したら、このデータを RecordedPrograms データ テーブルにコピーする必要があります。

最後に、システムが RecordingSession.onStopRecording() を呼び出します。この時点で、アプリは録画を直ちに停止する必要があります。 また、RecordedPrograms テーブルのエントリも作成する必要があります。 このエントリは、 RecordedPrograms.COLUMN_RECORDING_DATA_URI 列に録画したセッション データの URI を設定し、システムが最初に onStartRecording() を呼び出したときに提供したプログラム情報がすべて含まれている必要があります。

RecordedPrograms テーブルへのアクセス方法の詳細については、録画したセッションを管理するをご覧ください。

録画のエラーを処理する

録画中にエラーが発生し、録画したデータのレンダリングができない場合は、RecordingSession.notifyError() を呼び出してシステムに通知します。同様に、録画セッションの作成後に notifyError() を呼び出して、アプリがセッションを録画できないことをシステムに通知することもできます。

録画中にエラーが発生したにもかかわらず、一部の録画を再生できるようにしてユーザーに提供したい場合は、 RecordingSession.notifyRecordingStopped() を呼び出すと、システムで部分的なセッションを使用できるようになります。

録画したセッションを管理する

システムは、すべての録画可能チャンネル アプリで録画したすべてのセッションの情報を、TvContract.RecordedPrograms コンテンツ プロバイダ テーブルに保持します。 この情報は、 RecordedPrograms.Uri コンテンツ URI を使用してアクセスできます。コンテンツ プロバイダ API を使用して、このテーブルのエントリの読み取り、追加、削除が可能です。

コンテンツ プロバイダのデータの操作方法については、コンテンツ プロバイダの基本をご覧ください。

ベスト プラクティス

TV 端末のストレージには上限があるため、録画したセッションを保存するためにストレージを割り当てるときは、十分に検討してください。 録画したセッションを保存する容量が不足している場合は、 RecordingCallback.onError(RECORDING_ERROR_INSUFFICIENT_SPACE) を使用します。

ユーザーが録画を開始すると、できるだけ速やかにデータの録画を開始する必要があります。 録画を円滑に開始するには、システムが onCreateRecordingSession() コールバックを呼び出したときにストレージ容量のアクセスや割り当てなど、時間のかかるタスクをあからじめ完了しておきます。 そうすれば、onStartRecording() コールバックが発生したときに直ちに録画を開始できます。