À propos du mode Picture-in-picture (PIP)

Le mode Picture-in-picture (PIP) est un type spécial de mode multifenêtre principalement utilisé pour la lecture de vidéos. Elle permet à l'utilisateur de regarder une vidéo dans une petite fenêtre épinglée dans un coin de l'écran tout en naviguant entre les applications ou en parcourant le contenu de l'écran principal.

Le PIP utilise les API multifenêtres disponibles dans Android 7.0 pour fournir la fenêtre de superposition vidéo épinglée. Pour ajouter le mode PIP à votre application, vous devez enregistrer votre activité, la basculer en mode PIP si nécessaire, et vous assurer que les éléments de l'UI sont masqués et que la lecture de la vidéo se poursuit lorsque l'activité est en mode PIP.

使用 Jetpack 实现 PiP

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

Gérer votre UI en mode PIP

Lorsque vous passez en mode PIP, l'intégralité de l'UI de votre application s'affiche dans la fenêtre PIP, sauf si vous spécifiez l'apparence de votre UI en mode PIP et hors mode PIP.

Tout d'abord, vous devez savoir quand votre application est en mode PIP ou non. Pour ce faire, vous pouvez utiliser OnPictureInPictureModeChangedProvider. Le code ci-dessous vous indique si votre application est en mode 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
    }
}

Vous pouvez désormais utiliser rememberIsInPipMode() pour activer ou désactiver les éléments d'UI à afficher lorsque l'application passe en mode 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()
}