| page.title=TV 녹화 |
| page.keywords=preview, sdk, tv, 녹화 |
| page.tags=androidn |
| page.image=images/cards/card-nyc_2x.jpg |
| |
| @jd:body |
| |
| <div id="qv-wrapper"> |
| <div id="qv"> |
| <h2>이 문서의 내용</h2> |
| <ol> |
| <li><a href="#supporting">녹화 지원 나타내기</a></li> |
| <li><a href="#recording">세션 녹화</a></li> |
| <li><a href="#errors">녹화 오류 처리</a></li> |
| <li><a href="#sessions">녹화된 세션 관리</a></li> |
| <li><a href="#best">모범 사례</a></li> |
| </ol> |
| </div> |
| </div> |
| |
| <p>TV 입력 서비스를 이용하면 |
| 타임 시프팅 API를 통해 채널 재생을 일시 정지했다가 다시 시작할 수 있습니다. Android N에서는 사용자가 여러 개의 녹화된 세션을 저장할 수 있도록 함으로써 |
| 타임 시프팅을 확장합니다.</p> |
| |
| <p>사용자는 미리 녹화를 예약하거나 프로그램을 보면서 녹화를 |
| 시작할 수 있습니다. 시스템이 녹화물을 저장하면 사용자는 시스템 TV 앱을 사용하여 |
| 녹화물을 탐색, 관리, 재생할 수 있습니다.</p> |
| |
| <p>TV 입력 서비스에 녹화 기능을 제공하고 싶다면, |
| 앱이 녹화를 지원함을 시스템에 나타내야 하고, |
| 프로그램 녹화 기능을 구현해야 하고, 녹화 중 발생하는 오류를 처리 및 전달해야 하고, |
| 녹화된 세션을 관리해야 합니다.</p> |
| |
| <p class="note"><strong>참고:</strong> Live Channels 앱에서는 |
| 사용자가 녹화물을 만들거나 이에 액세스하는 방법을 아직 제공하지 않습니다. Live Channels 앱에 |
| 대한 변경이 이루어질 때까지는, TV 입력 서비스에 대한 녹화 |
| 환경을 완전히 테스트하기 어려울 수 있습니다.</p> |
| |
| <h2 id="supporting">녹화 지원 나타내기</h2> |
| |
| <p>TV 입력 서비스가 녹화를 지원함을 시스템에 알리려면 |
| 서비스 메타데이터 XML 파일에서 |
| <code>android:canRecord</code> 속성을 <code>true</code>로 설정하세요. |
| </p> |
| |
| <pre> |
| <tv-input xmlns:android="http://schemas.android.com/apk/res/android" |
| <b>android:canRecord="true"</b> |
| android:setupActivity="com.example.sampletvinput.SampleTvInputSetupActivity" /> |
| </pre> |
| |
| <p>서비스 메타데이터 파일에 대한 자세한 내용은 |
| <a href="{@docRoot}training/tv/tif/tvinput.html#manifest">매니페스트에서 TV 입력 |
| 서비스 선언</a>을 참조하세요. |
| </p> |
| |
| <p>또는 다음 단계에 따라 녹화 지원 사실을 코드에 |
| 표시할 수 있습니다.</p> |
| |
| <ol> |
| <li><code>TvInputService.onCreate()</code> 메서드에서 <code>TvInputInfo.Builder</code> |
| 클래스를 사용하여 새로운 |
| <code>TvInputInfo</code> 객체를 생성합니다.</li> |
| <li>새로운 <code>TvInputInfo</code> 객체를 생성할 때, <code>build()</code>를 호출하기 전에 |
| <code>setCanRecord(true)</code>를 호출하여 |
| 서비스가 녹화를 지원함을 나타냅니다.</li> |
| <li> |
| <code>TvInputManager.updateTvInputInfo()</code>를 호출하여 시스템에 <code>TvInputInfo</code> 객체를 등록합니다.</li> |
| </ol> |
| |
| <h2 id="recording">세션 녹화</h2> |
| |
| <p>TV 입력 서비스가 녹화 기능을 지원하도록 등록한 후, |
| 시스템은 앱의 녹화 구현에 액세스해야 할 때 |
| <code>TvInputService.onCreateRecordingSession()</code>을 호출합니다. |
| 자체적인 |
| <code>TvInputService.RecordingSession</code> 서브클래스를 구현하고 |
| <code>onCreateRecordingSession()</code> 콜백이 |
| 실행되면 이를 반환합니다. 이 서브클래스는 정확한 채널 데이터로 전환하고, |
| 요청된 데이터를 녹화하고, 녹화 상태와 오류를 시스템에 |
| 전송하는 역할을 담당합니다.</p> |
| |
| <p>시스템이 <code>RecordingSession.onTune()</code>을 호출하면 |
| 채널 URI에 전달되고, URI가 지정하는 채널에 맞춰 조정됩니다. |
| <code>notifyTuned()</code>를 호출해서 앱이 원하는 채널에 맞춰졌음을 시스템에 알리거나 |
| 앱이 적절한 채널에 맞출 수 없으면 |
| <code>notifyError()</code>를 호출합니다.</p> |
| |
| <p>이어서 시스템이 <code>RecordingSession.onStartRecording()</code> |
| 콜백을 호출합니다. 앱이 즉시 녹화를 시작해야 합니다. 시스템이 이 콜백을 호출하면, |
| 녹화될 프로그램에 관한 정보가 포함된 URI를 제공할 수 있습니다. |
| 녹화가 완료되면 이 |
| 데이터를 <code>RecordedPrograms</code> 데이터 테이블에 복사해야 합니다.</p> |
| |
| <p>마지막으로 시스템이 <code>RecordingSession.onStopRecording()</code>을 호출합니다. |
| 이 시점에서 앱이 즉시 녹화를 중단해야 합니다. 또한, |
| <code>RecordedPrograms</code> 테이블에서 항목을 생성해야 합니다. 이 항목에는 |
| <code>RecordedPrograms.COLUMN_RECORDING_DATA_URI</code> 열의 녹화된 세션 데이터 URI, |
| 최초 |
| <code>onStartRecording()</code> 호출에서 시스템이 제공한 프로그램 정보가 포함됩니다. |
| </p> |
| |
| <p><code>RecordedPrograms</code> 테이블에 액세스하는 자세한 방법은 |
| <a href="#sessions">녹화된 세션 관리</a>를 참조하세요.</p> |
| |
| <h2 id="errors">녹화 오류 처리</h2> |
| |
| <p>녹화 중에 오류가 발생해서 녹화된 데이터 렌더링을 사용할 수 없을 경우, |
| <code>RecordingSession.notifyError()</code>를 호출하여 시스템에 알립니다. |
| 마찬가지로 녹화 세션이 생성된 이후 <code>notifyError()</code>를 호출하여 |
| 앱이 더 이상 세션을 녹화하지 못한다는 것을 시스템에 알릴 수 있습니다.</p> |
| |
| <p>녹화 중에 오류가 발생했지만 |
| 사용자에게 재생 가능한 부분 녹화물을 제공하고 싶다면 |
| <code>RecordingSession.notifyRecordingStopped()</code>를 호출하여 시스템이 |
| 부분 세션을 사용할 수 있게 합니다.</p> |
| |
| <h2 id="sessions">녹화된 세션 관리</h2> |
| |
| <p>시스템은 <code>TvContract.RecordedPrograms</code> |
| 콘텐츠 제공자 테이블에 모든 녹화 가능한 채널 앱에서 녹화된 |
| 모든 세션에 관한 정보를 보관합니다. 이 정보는 |
| <code>RecordedPrograms.Uri</code> 콘텐츠 URI를 통해 액세스할 수 있습니다. 콘텐츠 제공자 API를 사용하여 |
| 이 테이블의 항목을 읽고, 추가하고, 삭제합니다.</p> |
| |
| <p>콘텐츠 제공자 데이터에 관한 자세한 정보는 |
| <a href="{@docRoot}guide/topics/providers/content-provider-basics.html"> |
| 콘텐츠 제공자 기본 정보</a>를 참조하세요.</p> |
| |
| <h2 id="best">모범 사례</h2> |
| |
| <p>TV 기기는 저장소가 제한될 수 있으므로 |
| 녹화된 세션을 저장할 저장소를 할당할 때는 신중히 판단하세요. 녹화된 세션을 저장할 공간이 부족할 때는 |
| <code>RecordingCallback.onError(RECORDING_ERROR_INSUFFICIENT_SPACE)</code>를 사용하세요. |
| </p> |
| |
| <p>사용자가 녹화를 시작하면 최대한 빨리 데이터 녹화를 |
| 시작해야 합니다. 이를 용이하게 하려면 |
| 시스템이 |
| <code>onCreateRecordingSession()</code> 콜백을 호출할 때 저장소 액세스 및 할당 등과 같이 선행 시간이 많이 걸리는 작업을 완료합니다. 이렇게 하면 |
| <code>onStartRecording()</code> 콜백이 |
| 실행될 때 즉시 녹화를 시작할 수 있습니다.</p> |