Informazioni su Picture in picture (PiP)

Picture in picture (PIP) è un tipo speciale di modalità multi-finestra utilizzata principalmente per la riproduzione video. Consente all'utente di guardare un video in una piccola finestra bloccata in un angolo dello schermo mentre naviga tra le app o sfoglia i contenuti nella schermata principale.

La funzionalità PIP sfrutta le API multi-finestra disponibili in Android 7.0 per fornire la finestra di overlay video bloccata. Per aggiungere la modalità PIP alla tua app, devi registrare la tua attività, passare alla modalità PIP in base alle necessità e assicurarti che gli elementi dell'interfaccia utente siano nascosti e che la riproduzione video continui quando l'attività è in modalità PIP.

Implement PiP with Jetpack

Use the Jetpack Picture-in-Picture library to implement picture-in-picture experience as it streamlines integration and reduces common in-app issues. Refer to our platform sample app to see an example of its usage. However, if you prefer to implement PiP using the platform APIs, refer to the following documentation.

Gestire l'interfaccia utente in modalità PIP

Quando entri in modalità PIP, l'intera UI dell'app entra nella finestra PIP, a meno che tu non specifichi l'aspetto della UI in modalità PIP e fuori dalla modalità PIP.

Innanzitutto, devi sapere quando la tua app è in modalità PIP o meno. Per farlo, puoi utilizzare OnPictureInPictureModeChangedProvider. Il codice riportato di seguito indica se l'app è in modalità 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
    }
}

Ora puoi utilizzare rememberIsInPipMode() per attivare/disattivare gli elementi dell'interfaccia utente da mostrare quando l'app entra in modalità 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()
}