1page.title=ピクチャ イン ピクチャ 2page.keywords=preview,sdk,PIP,Picture-in-picture 3page.tags=androidn 4 5@jd:body 6 7<div id="qv-wrapper"> 8<div id="qv"> 9 10<h2>このドキュメントの内容</h2> 11<ol> 12 <li><a href="#declaring">アクティビティがピクチャ イン ピクチャをサポートしていることを宣言する 13</a></li> 14 <li><a href="#pip_button">アクティビティをピクチャ イン ピクチャに切り替える</a> 15</li> 16 <li><a href="#handling_ui">ピクチャ イン ピクチャの実行中に UI を処理する</a> 17</li> 18 <li><a href="#continuing_playback">ピクチャ イン ピクチャの実行中に動画の再生を続行する 19</a></li> 20 <li><a href="#single_playback">ピクチャ イン ピクチャで単一の再生アクティビティを使用する 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)モードを使用すると、アプリはバックグランドで別のアクティビティを続けながら、固定されたウィンドウで動画アクティビティを実行できるようになります。 37 38PIP ウィンドウでは、アプリの使用中にマルチタスクを実行できます。これにより、ユーザーの作業効率が向上します。 39</p> 40 41<p>アプリで、PIP モードをトリガーするタイミングを決めることができます。次に、PIP モードの開始時点の例を示します。 42</p> 43 44<ul> 45<li>ユーザーが別のコンテンツをブラウジングするために動画から別のコンテンツに切り替えると、アプリは動画を PIP モードに切り替えることができます。 46</li> 47<li>コンテンツのエピソード終了の画面が表示されている間、アプリは動画を PIP モードに切り替えることができます。 48メイン画面には、シリーズの次のエピソードに関するプロモーションや概要の情報が表示されます。 49</li> 50<li>アプリで、ユーザーが動画を視聴している間に、追加のコンテンツのキューを作成する方法を提供できます。 51メイン画面でコンテンツの選択アクティビティを表示している間に、動画は PIP モードで再生を続行できます。 52</li> 53</ul> 54 55<p>PIP ウィンドウは 240 x 135 dp で、画面の 4 つのコーナーのうちいずれかの一番上のレイヤに表示されます。表示する場所はシステムによって選択されます。 56ユーザーは PIP メニューを表示して、PIP ウィンドウを全画面表示に切り替えたり、リモコンの [<b>Home</b>] ボタンを押して PIP ウィンドウを閉じたりすることができます。 57 58別の動画がメイン画面で再生を開始すると、PIP ウィンドウは自動的に閉じます。 59 60最近使ったアプリから PIP ウィンドウを閉じることもできます。</p> 61 62<img src="{@docRoot}preview/images/pip-active.png" /> 63<p class="img-caption"><strong>図 1.</strong> ユーザーがメイン画面でコンテンツを閲覧中に画面の隅に表示されるピクチャ イン ピクチャの動画 64 65</p> 66 67<p>PIP では、Android N で使用可能なマルチウィンドウ API を活用し、固定された動画オーバーレイ ウィンドウを表示します。 68PIP をアプリに追加するには、PIP をサポートするアクティビティを登録し、必要に応じてアクティビティを PIP モードに切り替えて、UI 要素を非表示にして、アクティビティが PIP モードを開始しても動画の再生が続行されるようにします。 69 70 71</p> 72 73<h2 id="declaring">アクティビティがピクチャ イン ピクチャをサポートしていることを宣言する</h2> 74 75<p>デフォルトでは、システムはアプリの PIP を自動的にサポートしません。アプリで PIP をサポートする場合、マニフェストで 76<code>android:supportsPictureInPicture</code> および 77<code>android:resizeableActivity</code> を <code>true</code> に設定して、動画アクティビティを登録します。 78 79また、アクティビティがレイアウトの設定変更を処理するように指定して、PIP モードの遷移中にレイアウト変更が発生しても、アクティビティが再開しないようにします。 80 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 モードでは、アクティビティが TV 画面の小さなオーバーレイ ウィンドウに表示される点に注意してください。 93動画の再生アクティビティは、最小限の UI にすることで最高のユーザー エクスペリエンスを提供できます。 94小さな UI 要素を含むアクティビティでは、PIP モードに切り替えたときに優れたユーザー エクスペリエンスを提供できない可能性があります。PIP ウィンドウでは、その UI 要素の詳細が見えづらくなるためです。 95 96 97</p> 98 99<h2 id="pip_button">アクティビティをピクチャ イン ピクチャに切り替える</h2> 100 101アクティビティを PIP モードに切り替える必要があるときは、 102<code>Activity.enterPictureInPictureMode()</code> を呼び出します。次の例では、ユーザーがメディア コントロール バーにある専用の PIP ボタンを選択したときに、PIP モードに切り替わります。 103 104</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 ボタンを追加すると、ユーザーが動画の再生を操作中に、簡単に PIP モードに切り替えることができます。 117</p> 118 119<img src="{@docRoot}preview/images/pip-button.png" /> 120<p class="img-caption"><strong>図 1.</strong> メディア コントロール バー上の [Picture-in-picture] ボタン 121</p> 122 123<p>Android N には、新しい 124<code>PlaybackControlsRow.PictureInPictureAction</code> クラスが含まれています。このクラスは、コントロール バーの PIP アクションと PIP アイコンの使用方法を定義します。 125</p> 126 127<h2 id="handling_ui">ピクチャ イン ピクチャの実行中に UI を処理する</h2> 128 129<p>アクティビティが PIP モードを開始したら、動画の再生のみを表示する必要があります。 130アクティビティが PIP を開始する前に UI 要素を削除して、再び全画面表示に戻ったら、削除した要素を復元します。<code>Activity.onPictureInPictureModeChanged()</code> または 131<code>Fragment.onPictureInPictureModeChanged()</code> をオーバーライドして、必要に応じて UI 要素を有効または無効にします。次に例を示します。 132 133 134</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">ピクチャ イン ピクチャの実行中に動画の再生を続行する 150</h2> 151 152<p>アクティビティを PIP に切り替えると、システムはそのアクティビティを一時停止状態と見なして、アクティビティの <code>onPause()</code> メソッドを呼び出します。 153PIP モードによってアクティビティが一時停止になっても、動画の再生は一時停止せず、再生を続ける必要があります。 154 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 モードを終了して全画面モードに戻ると、システムはアクティビティを再開して <code>onResume()</code> メソッドを呼び出します。 173</p> 174 175<h2 id="single_playback">ピクチャ イン ピクチャで単一の再生アクティビティを使用する 176</h2> 177 178<p>動画再生アクティビティが PIP モードのときに、ユーザーがアプリのメイン画面でコンテンツをブラウズ中に新しい動画を選択することがあります。 179全画面モードの既存の再生アクティビティで新しい動画を再生します。新しいアクティビティを起動するとユーザーが混乱する可能性があります。 180 181</p> 182 183<p>動画再生リクエストに対して単一のアクティビティが使用されるようにし、必要に応じて PIP モードの切り替えが行われるようにするには、マニフェストでアクティビティの 184<code>android:launchMode</code> を <code>singleTask</code> に設定します。 185 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 は、動画を全画面表示で再生するアクティビティに使用します。アクティビティを PIP モードに切り替えるときは、動画コンテンツ以外は何も表示しないでください。アクティビティが PIP モードを開始したタイミングを検出し、<a href="#handling_ui">ピクチャ イン ピクチャの実行中に UI を処理する</a>で説明したように、UI 要素を非表示にします。 203 204 205</p> 206 207<p>PIP ウィンドウは画面の隅にフローティング ウィンドウとして表示されるため、メイン画面のどの場所にも重要な情報を表示しないでください。PIP ウィンドウによって隠れる可能性があります。 208 209</p> 210 211<p>アクティビティが PIP モードになると、デフォルトで、入力フォーカスは失われます。PIP モードで動作中に入力イベントを受け付けるには、 212<code>MediaSession.setMediaButtonReceiver()</code> を使用します。 213</p> 214