Información acerca de la pantalla en pantalla (PIP)

La función de pantalla en pantalla (PIP) es un tipo especial de modo multiventana que se usa principalmente para la reproducción de videos. Permite al usuario ver un video en una ventana pequeña fijada en una esquina de la pantalla mientras navega entre apps o explora contenido en la pantalla principal.

PIP aprovecha las API de multiventana disponibles en Android 7.0 para proporcionar la ventana de video fijada superpuesta. Para agregar PIP a tu app, debes registrar tu actividad, cambiarla al modo de PIP según sea necesario y asegurarte de que los elementos de la IU estén ocultos y la reproducción de video continúe cuando la actividad esté en modo de PIP.

Implementa PiP con Jetpack

Usa la biblioteca de Jetpack Picture-in-Picture para implementar la experiencia de pantalla en pantalla, ya que optimiza la integración y reduce los problemas comunes en la app. Consulta nuestra app de ejemplo de la plataforma para ver un ejemplo de su uso. Sin embargo, si prefieres implementar el PIP con las APIs de la plataforma, consulta la siguiente documentación.

Cómo controlar la IU en el modo de PIP

Cuando ingresas al modo de PIP, toda la IU de tu app ingresa a la ventana de PIP, a menos que especifiques cómo debe verse tu IU dentro y fuera del modo de PIP.

Primero, debes saber cuándo tu app está en modo de PIP o no. Puedes usar OnPictureInPictureModeChangedProvider para lograrlo. El siguiente código te indica si tu app está en modo de PIP.

@Composable
fun rememberIsInPipMode(): Boolean {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        val activity = LocalContext.current.findActivity()
        var pipMode by remember { mutableStateOf(activity.isInPictureInPictureMode) }
        DisposableEffect(activity) {
            val observer = Consumer<PictureInPictureModeChangedInfo> { info ->
                pipMode = info.isInPictureInPictureMode
            }
            activity.addOnPictureInPictureModeChangedListener(
                observer
            )
            onDispose { activity.removeOnPictureInPictureModeChangedListener(observer) }
        }
        return pipMode
    } else {
        return false
    }
}

Ahora, puedes usar rememberIsInPipMode() para alternar los elementos de la IU que se mostrarán cuando la app entre en el modo de PIP:

val inPipMode = rememberIsInPipMode()

Column(modifier = modifier) {
    // This text will only show up when the app is not in PiP mode
    if (!inPipMode) {
        Text(
            text = "Picture in Picture",
        )
    }
    VideoPlayer()
}