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 入力サービスを宣言するをご覧ください。
また、以下の手順に沿って録画機能のサポートをコードで示すこともできます。
- TV 入力サービスの
onCreate()
メソッドで、TvInputInfo.Builder
クラスを使用して新しいTvInputInfo
オブジェクトを作成する。 - 新しい
TvInputInfo
オブジェクトを作成するときに、setCanRecord(true)
を呼び出してからbuild()
を呼び出して、サービスが録画をサポートしていることを示す。 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()
コールバックが発生したときに、直ちに録画を開始できます。