La función de imagen en imagen (PIP) para dispositivos de mano Android permite a los usuarios cambiar el tamaño de una aplicación con una actividad en curso en una pequeña ventana. PIP es especialmente útil para aplicaciones de video porque el contenido continúa reproduciéndose mientras el usuario puede realizar otras acciones. Los usuarios pueden manipular la posición de esta ventana a través de SystemUI e interactuar con la aplicación actualmente en imagen en imagen con (hasta tres) acciones proporcionadas por la aplicación.
PIP requiere la aceptación explícita de las aplicaciones que lo admiten y funciona por actividad. (Una sola aplicación puede tener múltiples actividades, de las cuales solo una está en PIP). Actividades solicitan ingresar imagen en imagen llamando a enterPictureInPictureMode()
y recibir devoluciones de llamada de actividad en forma de onPictureInPictureModeChanged()
.
El método setPictureInPictureParams()
permite que las actividades controlen su relación de aspecto mientras están en PIP y acciones personalizadas, lo que permite a los usuarios interactuar con la actividad sin tener que expandirla. En PIP, la actividad está en pausa, pero se está renderizando, y no recibe directamente la entrada táctil o el foco de la ventana. Solo una sola tarea puede estar en PIP a la vez.
Hay más información disponible en la documentación Picture-in-picture para desarrolladores de Android.
Requisitos del dispositivo
Para admitir PIP, habilite la función del sistema PackageManager#FEATURE_PICTURE_IN_PICTURE
en /android/frameworks/base/core/java/android/content/pm/PackageManager.java
. Los dispositivos que admiten PIP deben tener una pantalla de más de 220 dp en su ancho más pequeño. De manera similar a las ventanas múltiples de pantalla dividida, PIP permite que se ejecuten múltiples actividades en la pantalla al mismo tiempo. Por lo tanto, los dispositivos deben tener suficiente CPU y RAM para admitir este caso de uso.
Implementación
La mayor parte de la gestión del ciclo de vida de la actividad se realiza en el sistema entre ActivityManager
y WindowManager
. La implementación de la interfaz de usuario de referencia está en el paquete SystemUI
.
Las modificaciones al sistema no deberían afectar su comportamiento intrínseco según lo definido por las pruebas de Compatibility Test Suite (CTS) . La lógica del sistema para PIP gira principalmente en torno a la gestión de tareas y actividades dentro de la pila "fijada". Aquí hay una descripción general rápida de la clase:
-
ActivityRecord
: rastrea el estado de imagen en imagen de cada actividad. Para evitar que los usuarios ingresen a PIP en ciertas circunstancias, como desde la pantalla de bloqueo o durante lacheckEnterPictureInPictureState()
virtual, agregue casos paracheckEnterPictureInPictureState()
. -
ActivityManagerService
: la interfaz principal de la actividad para solicitar la entrada de PIP y la interfaz para las llamadas deWindowManager
ySystemUI
para cambiar el estado de la actividad de PIP. -
ActivityStackSupervisor
: llamado desdeActivityManagerService
para mover tareas dentro o fuera de la pila fija, actualizando elWindowManager
según sea necesario. -
PinnedStackWindowController
: la interfazWindowManager
deActivityManager
. -
PinnedStackController
: informa cambios en el sistema aSystemUI
, como IME mostrado / oculto, relación de aspecto cambiada o acciones cambiadas. -
BoundsAnimationController
: anima las ventanas de actividad de PIP de una manera que no desencadena un cambio de configuración al cambiar el tamaño. -
PipSnapAlgorithm
: una clase compartida utilizada tanto en el sistema como en SystemUI que controla el comportamiento de ajuste de la ventana PIP cerca de los bordes de la pantalla.
La SystemUI
referencia proporciona una implementación completa de PIP que admite la presentación de acciones personalizadas a los usuarios y la manipulación general, como la expansión y el despido. Los fabricantes de dispositivos pueden aprovechar estos cambios, siempre que no afecten los comportamientos intrínsecos definidos por el CDD. Aquí hay una descripción general rápida de la clase:
-
PipManager
: el componenteSystemUI
que se inicia conSystemUI
. -
PipTouchHandler
: el controlador táctil, que controla los gestos que manipulan el PIP. Esto solo se usa mientras el consumidor de entrada para el PIP está activo (verInputConsumerController
). Aquí se pueden agregar nuevos gestos. -
PipMotionHelper
: una clase de conveniencia que rastrea la posición PIP y la región permitida en la pantalla. Llama aActivityManagerService
para actualizar o animar la posición y el tamaño del PIP. -
PipMenuActivityController
: inicia una actividad que muestra las acciones proporcionadas por la actividad actualmente en PIP. Esta actividad es una actividad de superposición de tareas y elimina el consumidor de entrada superpuesto para permitir que sea interactiva. -
PipMenuActivity
: la implementación de la actividad del menú. -
PipMediaController
: el oyente que actualizaSystemUI
cuando la sesión de medios cambia de una manera que podría afectar las acciones predeterminadas en el PIP. -
PipNotificationController
: el controlador que asegura que una notificación esté activa mientras un usuario está usando la función PIP. -
PipDismissViewController
: la superposición que se muestra a los usuarios cuando comienzan a interactuar con el PIP para indicar que se puede descartar.
Ubicación predeterminada
Hay varios recursos del sistema que controlan la ubicación predeterminada del PIP:
-
config_defaultPictureInPictureGravity
: el entero de gravedad , que controla la esquina para colocar el PIP, comoBOTTOM|RIGHT
. -
config_defaultPictureInPictureScreenEdgeInsets
: las compensaciones de los lados de la pantalla para colocar el PIP. -
config_pictureInPictureDefaultSizePercent
yconfig_pictureInPictureDefaultAspectRatio
: la combinación del porcentaje del ancho de la pantalla y la relación de aspecto controla el tamaño del PIP. El tamaño de PIP predeterminado calculado no debe ser menor que@dimen/default_minimal_size_pip_resizable_task
, según lo definido por CTS y el CDD. -
config_pictureInPictureSnapMode
: el comportamiento dePipSnapAlgorithm
como se define enPipSnapAlgorithm
.
Las implementaciones de dispositivos no deben cambiar las relaciones de aspecto mínima y máxima que se definen en el CDD y CTS.
Permisos
La "operación de la aplicación" por paquete ( OP_PICTURE_IN_PICTURE
) en AppOpsManager
( master/core/java/android/app/AppOpsManager.java
), permite a los usuarios controlar PIP en un nivel por aplicación a través de la configuración del sistema. Las implementaciones de dispositivos deben respetar esta verificación cuando una actividad solicita ingresar al modo de imagen en imagen.
Pruebas
Para probar las implementaciones de PIP, ejecute todas las pruebas relacionadas con imagen en imagen que se encuentran en las pruebas CTS del lado del host en /cts/hostsidetests/services/activitymanager
, particularmente en ActivityManagerPinnedStackTests.java
.