1page.title=PIP 2page.keywords=preview, sdk, PIP, Picture-in-picture 3page.tags=androidn 4 5@jd:body 6 7<div id="tb-wrapper"> 8<div id="tb"> 9 10<h2>이 문서의 내용</h2> 11<ol> 12 <li><a href="#declaring">액티비티의 13PIP 지원 선언</a></li> 14 <li><a href="#pip_button">액티비티를 PIP로 전환</a> 15</li> 16 <li><a href="#handling_ui">PIP에서 UI 처리</a> 17</li> 18 <li><a href="#continuing_playback"> 19PIP에서 동영상 재생 계속</a></li> 20 <li><a href="#single_playback">PIP를 위한 단일 재생 액티비티 21사용</a></li> 22 <li><a href="#best">모범 사례</a></li> 23</ol> 24 25<h2>참고 항목</h2> 26<ol> 27 <li><a href="{@docRoot}preview/features/multi-window.html">다중 창 28지원</a></li> 29</ol> 30 31</div> 32</div> 33 34<p>Android N에서 Android TV 사용자는 35앱 안에서 탐색할 때 화면 모서리의 고정 창에서 36동영상을 볼 수 있습니다. PIP(Picture-In-Picture) 모드를 사용하면 37앱의 백그라운드에서 다른 액티비티를 계속하면서 38고정 창에서 동영상 액티비티를 실행할 수 있습니다. PIP 창에서 사용자는 앱을 사용하는 동안 멀티태스킹이 가능하므로 39생산성이 향상됩니다.</p> 40 41<p>앱이 PIP 모드를 실행할 시기를 결정할 수 있습니다. PIP 모드로 전환하는 시기와 관련된 몇 가지 42예시는 다음과 같습니다.</p> 43 44<ul> 45<li>사용자가 동영상에서 다른 콘텐츠를 탐색하러 이동할 때 앱이 46동영상을 PIP 모드로 전환할 수 있습니다.</li> 47<li>사용자가 콘텐츠 에피소드의 끝부분을 볼 때 앱이 48동영상을 PIP 모드로 전환할 수 있습니다. 메인 화면은 시리즈 다음 에피소드의 49홍보 또는 요약 정보를 표시합니다.</li> 50<li>사용자가 동영상을 보는 동안 앱이 51추가 콘텐츠를 대기열에 올릴 수 있는 방법을 제공할 수 있습니다. 메인 화면에 콘텐츠 선택 액티비티가 표시되는 동안 52동영상이 PIP 모드에서 계속 재생됩니다.</li> 53</ul> 54 55<p>PIP 창은 240x135dp이고 56화면 모서리 4개 중 하나에서 가장 위쪽 레이어에 표시되며, 시스템이 선택합니다. 사용자는 57리모컨의 <b>Home</b> 버튼을 눌러 58PIP 창을 전체 화면으로 전환하거나 PIP를 닫는 PIP 메뉴를 불러올 수 있습니다. 다른 동영상이 59메인 화면에서 재생되기 시작하면 PIP 창이 60자동으로 닫힙니다. 사용자가 Recents를 통해서 PIP 창을 닫을 수도 있습니다.</p> 61 62<img src="{@docRoot}images/android-7.0/pip-active.png" /> 63<p class="img-caption"><strong>그림 1.</strong> 사용자가 메인 화면에서 콘텐츠를 탐색하는 동안 64화면 모서리에 표시되는 PIP 동영상. 65</p> 66 67<p>PIP는 Android N에서 사용할 수 있는 다중 창 API를 사용하여 68고정된 동영상 오버레이 창을 제공합니다. 앱에 PIP를 추가하려면 69PIP를 지원하는 액티비티를 등록하고 필요한 경우 액티비티를 PIP 모드로 전환해야 합니다. 또한 70액티비티가 PIP 모드에 있을 때 UI 요소가 숨겨지고 동영상 재생이 71계속되는지 확인해야 합니다.</p> 72 73<h2 id="declaring">액티비티의 PIP 지원 선언</h2> 74 75<p>기본적으로 시스템은 앱에 대해 PIP를 자동으로 지원하지 않습니다. 76앱에서 PIP를 지원하려면 77<code>android:supportsPictureInPicture</code>와 78<code>android:resizeableActivity</code>를 <code>true</code>로 설정하여 매니페스트에서 동영상 액티비티를 79등록합니다. 또한, 80PIP 모드 전환 시 레이아웃 변경이 일어날 때 액티비티가 다시 시작되지 않도록 81액티비티가 레이아웃 구성 변화를 처리하게 지정합니다.</p> 82 83<pre> 84<activity android:name="VideoActivity" 85 android:resizeableActivity="true" 86 android:supportsPictureInPicture="true" 87 android:configChanges= 88 "screenSize|smallestScreenSize|screenLayout|orientation" 89 ... 90</pre> 91 92<p>액티비티를 등록할 때는 PIP 모드에서 93액티비티가 TV 화면의 작은 오버레이 창에 표시된다는 것을 기억하세요. 최소 UI를 포함한 94동영상 재생 액티비티가 가장 좋은 사용자 환경을 제공합니다. 작은 UI 요소를 포함한 95액티비티는 PIP 모드로 전환할 때 96사용자가 PIP 창의 UI 요소를 상세히 볼 수 없으므로 97좋은 사용자 환경을 제공하지 못할 수 있습니다.</p> 98 99<h2 id="pip_button">액티비티를 PIP로 전환</h2> 100 101액티비티를 PIP 모드로 전환해야 하는 경우 102<code>Activity.enterPictureInPictureMode()</code>를 호출합니다. 다음 예에서는 사용자가 103미디어 컨트롤 막대에서 전용 PIP 버튼을 선택했을 때 104PIP 모드로 전환합니다.</p> 105 106<pre> 107@Override 108public void onActionClicked(Action action) { 109 if (action.getId() == R.id.lb_control_picture_in_picture) { 110 getActivity().enterPictureInPictureMode(); 111 return; 112 } 113 ... 114</pre> 115 116<p>미디어 컨트롤 막대에 PIP 버튼을 추가하면 117사용자가 동영상 재생을 제어하면서 PIP 모드로 쉽게 전환할 수 있습니다.</p> 118 119<img src="{@docRoot}images/android-7.0/pip-button.png" /> 120<p class="img-caption"><strong>그림 1.</strong> 미디어 컨트롤 막대의 PIP 121버튼.</p> 122 123<p>Android N에는 컨트롤 막대 PIP 동작을 정의하고 PIP 아이콘을 사용하는 새로운 124<code>PlaybackControlsRow.PictureInPictureAction</code> 클래스가 포함되어 있습니다. 125</p> 126 127<h2 id="handling_ui">PIP에서 UI 처리</h2> 128 129<p>액티비티가 PIP 모드로 전환되면 130동영상 재생만 표시됩니다. 액티비티가 PIP 모드로 전환되기 전에 UI 요소를 제거하고 131액티비티가 다시 전체 화면이 되었을 때 이 요소를 복원합니다. 132필요에 따라 <code>Activity.onPictureInPictureModeChanged()</code> 또는 133<code>Fragment.onPictureInPictureModeChanged()</code>를 재정의하고 134UI 요소를 활성화/비활성화합니다. 예를 들면 다음과 같습니다.</p> 135 136<pre> 137@Override 138public void onPictureInPictureModeChanged(boolean isInPictureInPictureMode) { 139 if (isInPictureInPictureMode) { 140 // Hide the controls in picture-in-picture mode. 141 ... 142 } else { 143 // Restore the playback UI based on the playback status. 144 ... 145 } 146} 147</pre> 148 149<h2 id="continuing_playback">PIP에서 동영상 재생 계속 150</h2> 151 152<p>액티비티가 PIP 모드로 전환되면 시스템은 153액티비티가 일시 정지된 상태에 있다고 간주하고 액티비티의 <code>onPause()</code> 메서드를 호출합니다. 동영상 154재생은 일시 정지되어서는 안되며 PIP 모드로 인해 액티비티가 일시 정지되었다면 155계속 재생되어야 합니다. 액티비티의 156<code>onPause()</code> 메서드에서 PIP를 확인하고 적절히 재생을 처리합니다. 예를 들면 다음과 같습니다. 157</p> 158 159<pre> 160@Override 161public void onPause() { 162 // If called while in PIP mode, do not pause playback 163 if (isInPictureInPictureMode()) { 164 // Continue playback 165 ... 166 } 167 // If paused but not in PIP, pause playback if necessary 168 ... 169} 170</pre> 171 172<p>액티비티가 PIP 모드에서 전체 화면 모드로 전환되면 173시스템이 액티비티를 재시작하고 <code>onResume()</code> 메서드를 호출합니다.</p> 174 175<h2 id="single_playback">PIP를 위한 단일 재생 액티비티 176사용</h2> 177 178<p>동영상 재생 액티비티가 PIP 모드에 있는 동안, 앱에서 179사용자가 메인 화면에서 콘텐츠를 찾아볼 때 새 동영상을 선택할 수도 있습니다. 이 때 새 액티비티를 시작하면 180사용자에게 혼동을 줄 수 있으므로, 새 액티비티를 시작하는 대신 181기존 재생 액티비티에서 새 동영상을 전체 화면 모드로 재생합니다.</p> 182 183<p>동영상 재생 요청에 단일 액티비티가 사용되도록 하고 184필요에 따라 PIP 모드로 들어가거나 PIP 모드에서 나오도록 하려면, 매니페스트에서 액티비티의 185<code>android:launchMode</code>를 <code>singleTask</code>로 설정합니다. 186</p> 187 188<pre> 189<activity android:name="VideoActivity" 190 ... 191 android:supportsPictureInPicture="true" 192 android:launchMode="singleTask" 193 ... 194</pre> 195 196<p>액티비티에서 {@link android.app.Activity#onNewIntent 197Activity.onNewIntent()}를 재정의하고 새 동영상을 처리하며, 필요한 경우 기존 동영상 198재생을 중단시키세요.</p> 199 200<h2 id="best">모범 사례</h2> 201 202<p>PIP는 전체 화면 동영상을 재생하는 액티비티용입니다. 액티비티를 203PIP 모드로 전환할 때는 동영상 콘텐츠만 표시하세요. 204<a href="#handling_ui">PIP에서 UI 처리</a>에서 설명한 바와 같이 액티비티가 PIP 모드로 전환되는 때를 205추적하고 UI 요소를 숨깁니다.</p> 206 207<p>PIP 창이 화면 모서리에 떠 있는 창으로 표시되므로 208PIP 창으로 가려질 수 있는 영역에는 메인 화면에서 209중요한 정보를 표시하지 말아야 합니다.</p> 210 211<p>액티비티가 PIP 모드일 때는 기본적으로 입력 포커스를 받지 않습니다. PIP 모드에서 212입력 이벤트를 수신하려면 213<code>MediaSession.setMediaButtonReceiver()</code>를 사용합니다.</p> 214