Votre application ne doit pas passer en mode PiP dans les situations suivantes:
- Si la vidéo est arrêtée ou mise en pause.
- Si vous vous trouvez sur une page différente de l'application que le lecteur vidéo.
Pour contrôler le moment où votre application passe en mode PiP, ajoutez une variable qui suit l'état du lecteur vidéo à l'aide d'un mutableStateOf
.
Activer/Désactiver l'état en fonction de la lecture de la vidéo
Pour activer ou désactiver l'état en fonction de la lecture du lecteur vidéo, ajoutez un écouteur au lecteur vidéo. Activez ou désactivez l'état de votre variable d'état en fonction de la présence ou non du joueur:
player.addListener(object : Player.Listener { override fun onIsPlayingChanged(isPlaying: Boolean) { shouldEnterPipMode = isPlaying } })
Activer/Désactiver l'état en fonction de la libération du joueur
Lorsque le lecteur est libéré, définissez votre variable d'état sur false
:
fun releasePlayer() { shouldEnterPipMode = false }
Utiliser l'état pour définir si le mode PiP est activé (avant Android 12)
- Étant donné que l'ajout de PiP avant la version 12 utilise un
DisposableEffect
, vous devez créer une variable parrememberUpdatedState
avecnewValue
défini comme variable d'état. Cela garantit que la version mise à jour est utilisée dansDisposableEffect
. Dans le lambda qui définit le comportement lorsque
OnUserLeaveHintListener
est déclenché, ajoutez une instructionif
avec la variable d'état autour de l'appel deenterPictureInPictureMode()
:val currentShouldEnterPipMode by rememberUpdatedState(newValue = shouldEnterPipMode) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && Build.VERSION.SDK_INT < Build.VERSION_CODES.S ) { val context = LocalContext.current DisposableEffect(context) { val onUserLeaveBehavior: () -> Unit = { if (currentShouldEnterPipMode) { context.findActivity() .enterPictureInPictureMode(PictureInPictureParams.Builder().build()) } } context.findActivity().addOnUserLeaveHintListener( onUserLeaveBehavior ) onDispose { context.findActivity().removeOnUserLeaveHintListener( onUserLeaveBehavior ) } } } else { Log.i("PiP info", "API does not support PiP") }
Utiliser l'état pour définir si le mode PiP est activé (après Android 12)
Transmettez votre variable d'état à setAutoEnterEnabled
afin que votre application n'entre en mode PiP qu'au bon moment:
val pipModifier = modifier.onGloballyPositioned { layoutCoordinates -> val builder = PictureInPictureParams.Builder() // Add autoEnterEnabled for versions S and up if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { builder.setAutoEnterEnabled(shouldEnterPipMode) } context.findActivity().setPictureInPictureParams(builder.build()) } VideoPlayer(pipModifier)
Utiliser setSourceRectHint
pour implémenter une animation fluide
L'API setSourceRectHint
crée une animation plus fluide pour passer en mode PiP. Sous Android 12 ou version ultérieure, il crée également une animation plus fluide pour quitter le mode PiP.
Ajoutez cette API au compilateur PiP pour indiquer la zone de l'activité visible après la transition vers PiP.
- N'ajoutez
setSourceRectHint()
àbuilder
que si l'état définit que l'application doit passer en mode PiP. Cela évite de calculersourceRect
lorsque l'application n'a pas besoin d'entrer en mode PiP. - Pour définir la valeur
sourceRect
, utilisez leslayoutCoordinates
fournies par la fonctiononGloballyPositioned
sur le modificateur. - Appelez
setSourceRectHint()
surbuilder
et transmettez la variablesourceRect
.
val context = LocalContext.current val pipModifier = modifier.onGloballyPositioned { layoutCoordinates -> val builder = PictureInPictureParams.Builder() if (shouldEnterPipMode) { val sourceRect = layoutCoordinates.boundsInWindow().toAndroidRectF().toRect() builder.setSourceRectHint(sourceRect) } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { builder.setAutoEnterEnabled(shouldEnterPipMode) } context.findActivity().setPictureInPictureParams(builder.build()) } VideoPlayer(pipModifier)