page.title=Modo Picture-in-picture page.keywords=preview,sdk,PIP,Picture-in-picture page.tags=androidn @jd:body
Con Android N, los usuarios de Android TV ahora pueden ver un video en una ventana fija que se ubica en una esquina de la pantalla mientras navegan dentro de aplicaciones. El modo picture-in-picture (PIP) permite que las aplicaciones reproduzcan un video en una ventana fija mientras se lleva a cabo otra actividad en el fondo. La ventana de PIP les permite a los usuarios realizar múltiples tareas mientras usan tu aplicación, lo cual les permite ser más productivos.
Tu aplicación puede decidir cuándo activar el modo PIP. Aquí te mostramos algunos ejemplos de situaciones en las que se podría usar el modo PIP:
La ventana de PIP es de 240x135 dp y se muestra en la capa delantera en una de las cuatro esquinas de la pantalla que el sistema elige. El usuario puede acceder a un menú de PIP que le permite activar o desactivar la ventana de PIP a pantalla completa o cerrarla presionando el botón Home en el control remoto. Si se comienza a reproducir otro video en la pantalla principal, la ventana de PIP se cierra automáticamente. Los usuarios también pueden cerrar la ventana de PIP desde Recents.
El modo PIP aprovecha las API de ventanas múltiples disponibles en Android N para brindar la ventana superpuesta fija de video. Para agregarle el modo PIP a tu aplicación, debes registrar las actividades que permitan este modo, cambiar la actividad al modo PIP según sea necesario y asegurarte de que los elementos de IU se oculten y que la reproducción de video continúe mientras la actividad se encuentra en modo PIP.
De forma predeterminada, el sistema no permite el modo PIP para aplicaciones automáticamente.
Si deseas permitir este modo en tu aplicaciones, registra la actividad
de video en tu manifiesto configurando
android:supportsPictureInPicture
y
android:resizeableActivity
en true
. Además, debes especificar
que tu actividad gestiona los cambios de configuración de la presentación para que la actividad
no se reinicie cuando ocurran cambios de presentación durante las transiciones en el modo PIP.
<activity android:name="VideoActivity" android:resizeableActivity="true" android:supportsPictureInPicture="true" android:configChanges= "screenSize|smallestScreenSize|screenLayout|orientation" ...
Cuando registres la actividad, ten en cuenta que, en el modo PIP, la actividad se muestra en una ventana superpuesta pequeña en una pantalla de TV. Las actividades de reproducción de videos con IU mínimas brindan la mejor experiencia de usuario. Las actividades que incluyen elementos de IU pequeños podrían no brindar una buena experiencia de usuario cuando se cambian al modo PIP, porque los usuarios no podrán ver los detalles de los elementos de IU en la ventana PIP.
Activity.enterPictureInPictureMode()
. En el siguiente ejemplo, se
cambia al modo PIP cuando el usuario selecciona un botón PIP especial en una barra
de control de medios:
@Override public void onActionClicked(Action action) { if (action.getId() == R.id.lb_control_picture_in_picture) { getActivity().enterPictureInPictureMode(); return; } ...
Agregar un botón PIP a la barra de control de medios le permite al usuario cambiar fácilmente al modo PIP y seguir controlando la reproducción de video.
Android N incluye una nueva clase
PlaybackControlsRow.PictureInPictureAction
que define
las acciones de PIP de la barra de control y usa el ícono PIP.
Cuando la actividad ingresa al modo PIP, esta solo debería mostrar la reproducción
de video. Debes quitar los elementos de IU antes de que la actividad ingrese al modo PIP
y volver a mostrarlos cuando la actividad vuelva al modo de pantalla completa.
Anula Activity.onPictureInPictureModeChanged()
o
Fragment.onPictureInPictureModeChanged()
y habilita
o inhabilita los elementos de IU según sea necesario, por ejemplo:
@Override public void onPictureInPictureModeChanged(boolean isInPictureInPictureMode) { if (isInPictureInPictureMode) { // Hide the controls in picture-in-picture mode. ... } else { // Restore the playback UI based on the playback status. ... } }
Cuando la actividad cambia al modo PIP, el sistema considera que se encuentra en
pausa y llama al método onPause()
de la actividad. La reproducción
de video no debería pausarse y debería continuar si la actividad se
pausa debido al modo PIP. Busca el modo PIP en el método
onPause()
de la actividad y controla la reproducción según corresponda, por
ejemplo:
@Override public void onPause() { // If called while in PIP mode, do not pause playback if (isInPictureInPictureMode()) { // Continue playback ... } // If paused but not in PIP, pause playback if necessary ... }
Cuando la actividad sale del modo PIP y vuelve al modo de pantalla completa, el
sistema reinicia la actividad y llama al método onResume()
.
En tu aplicación, un usuario puede seleccionar un nuevo video cuando busca contenido en la pantalla principal, mientras una actividad de reproducción de video está en modo PIP. Reproduce el nuevo video en la actividad de reproducción actual en modo de pantalla completa, en lugar de iniciar una nueva actividad que podría confundir al usuario.
A fin de garantizar que se utilice una única actividad para las solicitudes de reproducción de video y que esta
ingrese en el modo PIP o salga de este cuando sea necesario, configura el
android:launchMode
de la actividad en singleTask
, en el manifiesto:
<activity android:name="VideoActivity" ... android:supportsPictureInPicture="true" android:launchMode="singleTask" ...
En tu actividad, anula {@link android.app.Activity#onNewIntent Activity.onNewIntent()} y administra el nuevo video, deteniendo cualquier reproducción de video actual si es necesario.
El modo PIP está diseñado para actividades que reproducen un video en pantalla completa. Cuando cambies la actividad al modo PIP, evita que se muestre cualquier elemento que no sea el contenido del video. Rastrea el cambio a modo PIP de la actividad y oculta los elementos de IU, como se explica en la sección Gestionar las IU durante el modo picture-in-picture.
Debido a que la ventana de PIP se muestra como una ventana flotante en una esquina de la pantalla, debes evitar mostrar información importante en la pantalla principal en cualquier área que pueda quedar oculta detrás de la ventana de PIP.
Cuando una actividad se encuentra en modo PIP, de forma predeterminada, no tiene focalización en las entradas. Para
recibir eventos de entradas durante este modo, usa
MediaSession.setMediaButtonReceiver()
.