blob: fa557bcf14fdd06a53e61926bf8717bf60877138 [file] [log] [blame]
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>
&lt;tv-input xmlns:android="http://schemas.android.com/apk/res/android"
<b>android:canRecord="true"</b>
android:setupActivity="com.example.sampletvinput.SampleTvInputSetupActivity" /&gt;
</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>