Informazioni su Picture in picture (PiP)

Picture in picture (PIP) è un tipo speciale di modalità multi-finestra utilizzato principalmente per la riproduzione di 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.

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

使用 Jetpack 实现 PiP

使用 Jetpack 画中画库来实现画中画体验,因为它可以简化集成并减少常见的应用内问题。如需查看其使用示例,请参阅我们的平台示例应用。不过,如果您希望使用平台 API 实现 PiP,请参阅以下文档。

Gestisci la UI in modalità PIP

Quando attivi la modalità PIP, l'intera UI dell'app viene visualizzata nella finestra PIP, a meno che tu non specifichi l'aspetto dell'UI in modalità PIP e non PIP.

Innanzitutto, devi sapere quando la tua app è in modalità PIP o meno. Per farlo, puoi utilizzare OnPictureInPictureModeChangedProvider. Il seguente codice verifica 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 UI 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()
}