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

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

ユーザーはあらかじめ録画をスケジュールできます。また、プログラムを視聴しながら録画を開始することもできます。録画が保存されると、ユーザーは、システムの 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. TV 入力サービスの onCreate メソッドで、新しい TvInputInfo オブジェクトを TvInputInfo.Builder クラスを使用して作成します。
  2. 新しい TvInputInfo オブジェクトを作成するときに、build を呼び出す前に setCanRecord(true) を呼び出して、サービスが録画をサポートしていることを示します。
  3. TvInputInfo オブジェクトをシステムに登録するには、 TvInputManager.updateTvInputInfo を呼び出します。

セッションを録画する

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

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

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

最後に、システムは RecordingSession.onStopRecording を呼び出します。この時点で、アプリはすぐに録画を停止する必要があります。また、 RecordedPrograms テーブルに録画されたセッションデータの URI を含み、 RecordedPrograms.COLUMN_RECORDING_DATA_URI 列、および 情報を含むエントリを onStartRecording の最初の呼び出しでシステムから提供されたプログラム に作成する必要があります。

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

録画エラーを処理する

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

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

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

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

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

ベスト プラクティス

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

ユーザーが録画を開始したら、できるだけ早くデータの録画を開始します。これを容易にするため、システムが onCreateRecordingSession コールバックを呼び出すときに、ストレージ スペースへのアクセスや割り当てなど、時間のかかる事前タスクを完了します。これにより、onStartRecording コールバックがトリガーされたときにすぐに録画を開始できます。