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

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.Builder クラスを使用して新しい TvInputInfo オブジェクトを作成します。
  2. 新しい TvInputInfo オブジェクトを作成するときは、build() を呼び出してから setCanRecord(true) を呼び出して、サービスが録画をサポートしていることを示します。
  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 テーブルへのアクセス方法について詳しくは、録画したセッションを管理するをご覧ください。

録画エラーを処理する

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

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

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

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

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

おすすめの方法

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

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