コンテンツの録画をサポートする

テレビ入力サービスでは、タイムシフト API を使用してチャンネル再生の一時停止や再開ができます。Android 7.0 では、ユーザーが録画した複数のセッションを保存できるようにすることで、タイムシフトが拡張されています。

ユーザーは事前に録画をスケジュールするか、番組を視聴しながら録画を開始できます。システムが録画を保存すると、ユーザーはシステムのテレビアプリを使用して、その録画のブラウジング、管理、再生を行うことができます。

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. TV 入力サービスの onCreate() メソッドで、TvInputInfo.Builder クラスを使用して新しい TvInputInfo オブジェクトを作成します。
  2. 新しい TvInputInfo オブジェクトを作成する際は、build() を呼び出す前に setCanRecord(true) を呼び出して、サービスが録画をサポートしていることを示します。
  3. TvInputManager.updateTvInputInfo() を呼び出して、TvInputInfo オブジェクトをシステムに登録します。

セッションを録画する

テレビ入力サービスは録画機能のサポートを登録すると、アプリの録画機能の実装にアクセスする必要があるときに 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 テーブルへのアクセス方法について詳しくは、録画されたセッションを管理するをご覧ください。

録画エラーを処理する

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

録画中にエラーが発生したものの、部分的な録画を再生できるようにしたい場合は、notifyRecordingStopped() を呼び出して、部分的なセッションをシステムが使用できるようにします。

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

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

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

ベスト プラクティス

TV デバイスのストレージは限られている場合があるため、録画したセッションを保存するためにストレージを割り当てる場合は、慎重に判断してください。録画したセッションを保存するための十分な容量がない場合は、RecordingCallback.onError(RECORDING_ERROR_INSUFFICIENT_SPACE) を使用します。

ユーザーが録画を開始したら、できるだけ早くデータの記録を開始します。この処理を容易にするために、システムが onCreateRecordingSession() コールバックを呼び出したときに、保存容量へのアクセスや割り当てなど、時間のかかる作業を事前に完了してください。そうすることで、onStartRecording() コールバックが発生したときにすぐに録画を開始できます。