Modo Picture-in-picture

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:

  • Tu aplicación puede pasar un video al modo PIP cuando el usuario retrocede en la navegación desde el video para explorar otro contenido.
  • También puede hacerlo mientras el usuario está viendo el final de un episodio de contenido. La pantalla principal muestra información promocional o de resumen sobre el próximo capítulo de la serie.
  • Tu aplicación puede brindarles a los usuarios una forma de poner en cola otro contenido mientras miran un video. El video continúa reproduciéndose en modo PIP mientras la pantalla principal muestra una actividad de selección de contenido.

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.

Imagen 1. Un video picture-in-picture visible en una esquina de la pantalla mientras el usuario explora contenido en la pantalla principal.

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.

Declarar que la actividad permite el modo picture-in-picture

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.

Cambiar la actividad al modo Picture-in-picture

Cuando necesites cambiar la actividad al modo PIP, llama a 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.

Imagen 1. Un botón PIP en una barra de control de medios.

Android N incluye una nueva clase PlaybackControlsRow.PictureInPictureAction que define las acciones de PIP de la barra de control y usa el ícono PIP.

Gestionar las IU durante el modo picture-in-picture

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.
        ...
    }
}

Continuar la reproducción de video durante el modo Picture-in-picture

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().

Usar una única actividad de reproducción para el modo Picture-in-picture

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 Activity.onNewIntent() y administra el nuevo video, deteniendo cualquier reproducción de video actual si es necesario.

Prácticas recomendadas

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().