Restez organisé à l'aide des collections
Enregistrez et classez les contenus selon vos préférences.
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:
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 par rememberUpdatedState avec newValue défini comme variable d'état. Cela garantit que la version mise à jour est utilisée dans DisposableEffect.
Dans le lambda qui définit le comportement lorsque OnUserLeaveHintListener est déclenché, ajoutez une instruction if avec la variable d'état autour de l'appel de enterPictureInPictureMode():
valcurrentShouldEnterPipModebyrememberUpdatedState(newValue=shouldEnterPipMode)if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.O&&
Build.VERSION.SDK_INT < Build.VERSION_CODES.S){valcontext=LocalContext.currentDisposableEffect(context){valonUserLeaveBehavior=Runnable{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:
valpipModifier=modifier.onGloballyPositioned{layoutCoordinates->
valbuilder=PictureInPictureParams.Builder()// Add autoEnterEnabled for versions S and upif(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 calculer sourceRect lorsque l'application n'a pas besoin d'entrer en mode PiP.
Pour définir la valeur sourceRect, utilisez les layoutCoordinates fournies par la fonction onGloballyPositioned sur le modificateur.
Appelez setSourceRectHint() sur builder et transmettez la variable sourceRect.
Le contenu et les exemples de code de cette page sont soumis aux licences décrites dans la Licence de contenu. Java et OpenJDK sont des marques ou des marques déposées d'Oracle et/ou de ses sociétés affiliées.
Dernière mise à jour le 2025/08/31 (UTC).
[[["Facile à comprendre","easyToUnderstand","thumb-up"],["J'ai pu résoudre mon problème","solvedMyProblem","thumb-up"],["Autre","otherUp","thumb-up"]],[["Il n'y a pas l'information dont j'ai besoin","missingTheInformationINeed","thumb-down"],["Trop compliqué/Trop d'étapes","tooComplicatedTooManySteps","thumb-down"],["Obsolète","outOfDate","thumb-down"],["Problème de traduction","translationIssue","thumb-down"],["Mauvais exemple/Erreur de code","samplesCodeIssue","thumb-down"],["Autre","otherDown","thumb-down"]],["Dernière mise à jour le 2025/08/31 (UTC)."],[],[],null,["Your app should not enter PiP mode in the following situations:\n\n- If the video is stopped or paused.\n- If you are on a different page of the app than the video player.\n\nTo control when your app enters PiP mode, add a variable that tracks the state\nof the video player using a [`mutableStateOf`](/reference/kotlin/androidx/compose/runtime/package-summary#mutableStateOf(kotlin.Any,androidx.compose.runtime.SnapshotMutationPolicy)).\n\nToggle state based on if video is playing\n\nTo toggle the state based on if the video player is playing, add a listener on\nthe video player. Toggle the state of your state variable based on if the player\nis playing or not:\n\n\n```kotlin\nplayer.addListener(object : Player.Listener {\n override fun onIsPlayingChanged(isPlaying: Boolean) {\n shouldEnterPipMode = isPlaying\n }\n})https://github.com/android/snippets/blob/f95ab59fad80aeaf5d6a90bab8a01a126f20f44e/compose/snippets/src/main/java/com/example/compose/snippets/pictureinpicture/PictureInPictureSnippets.kt#L171-L175\n```\n\n\u003cbr /\u003e\n\nToggle state based on if player is released\n\nWhen the player is released, set your state variable to `false`:\n\n\n```kotlin\nfun releasePlayer() {\n shouldEnterPipMode = false\n}https://github.com/android/snippets/blob/f95ab59fad80aeaf5d6a90bab8a01a126f20f44e/compose/snippets/src/main/java/com/example/compose/snippets/pictureinpicture/PictureInPictureSnippets.kt#L180-L182\n```\n\n\u003cbr /\u003e\n\nUse state to define if PiP mode is entered (pre-Android 12)\n\n1. Since adding PiP pre-12 uses a [`DisposableEffect`](/develop/ui/compose/side-effects#disposableeffect), you need to create a new variable by [`rememberUpdatedState`](/develop/ui/compose/side-effects#rememberupdatedstate) with `newValue` set as your state variable. This will ensure that the updated version is used within the `DisposableEffect`.\n2. In the lambda that defines the behavior when the `OnUserLeaveHintListener`\n is triggered, add an `if` statement with the state variable around the call to\n `enterPictureInPictureMode()`:\n\n\n ```kotlin\n val currentShouldEnterPipMode by rememberUpdatedState(newValue = shouldEnterPipMode)\n if (Build.VERSION.SDK_INT \u003e= Build.VERSION_CODES.O &&\n Build.VERSION.SDK_INT \u003c Build.VERSION_CODES.S\n ) {\n val context = LocalContext.current\n DisposableEffect(context) {\n val onUserLeaveBehavior = Runnable {\n if (currentShouldEnterPipMode) {\n context.findActivity()\n .enterPictureInPictureMode(PictureInPictureParams.Builder().build())\n }\n }\n context.findActivity().addOnUserLeaveHintListener(\n onUserLeaveBehavior\n )\n onDispose {\n context.findActivity().removeOnUserLeaveHintListener(\n onUserLeaveBehavior\n )\n }\n }\n } else {\n Log.i(\"PiP info\", \"API does not support PiP\")\n }https://github.com/android/snippets/blob/f95ab59fad80aeaf5d6a90bab8a01a126f20f44e/compose/snippets/src/main/java/com/example/compose/snippets/pictureinpicture/PictureInPictureSnippets.kt#L381-L404\n ```\n\n \u003cbr /\u003e\n\nUse state to define if PiP mode is entered (post-Android 12)\n\nPass your state variable into `setAutoEnterEnabled` so that your app only enters\nPiP mode at the right time:\n\n\n```kotlin\nval pipModifier = modifier.onGloballyPositioned { layoutCoordinates -\u003e\n val builder = PictureInPictureParams.Builder()\n\n // Add autoEnterEnabled for versions S and up\n if (Build.VERSION.SDK_INT \u003e= Build.VERSION_CODES.S) {\n builder.setAutoEnterEnabled(shouldEnterPipMode)\n }\n context.findActivity().setPictureInPictureParams(builder.build())\n}\n\nVideoPlayer(pipModifier)https://github.com/android/snippets/blob/f95ab59fad80aeaf5d6a90bab8a01a126f20f44e/compose/snippets/src/main/java/com/example/compose/snippets/pictureinpicture/PictureInPictureSnippets.kt#L194-L204\n```\n\n\u003cbr /\u003e\n\nUse `setSourceRectHint` to implement a smooth animation\n\nThe [`setSourceRectHint`](/reference/android/app/PictureInPictureParams.Builder#setSourceRectHint(android.graphics.Rect)) API creates a smoother animation for entering PiP\nmode. In Android 12+, it also creates a smoother animation for exiting PiP mode.\nAdd this API to the PiP builder to indicate the area of the activity that is\nvisible following the transition into PiP.\n\n1. Only add `setSourceRectHint()` to the `builder` if the state defines that the app should enter PiP mode. This avoids calculating `sourceRect` when the app does not need to enter PiP.\n2. To set the `sourceRect` value, use the `layoutCoordinates` that are given from the [`onGloballyPositioned`](/reference/kotlin/androidx/compose/ui/layout/OnGloballyPositionedModifier) function on the modifier.\n3. Call `setSourceRectHint()` on the `builder` and pass in the `sourceRect` variable.\n\n\n```kotlin\nval context = LocalContext.current\n\nval pipModifier = modifier.onGloballyPositioned { layoutCoordinates -\u003e\n val builder = PictureInPictureParams.Builder()\n if (shouldEnterPipMode) {\n val sourceRect = layoutCoordinates.boundsInWindow().toAndroidRectF().toRect()\n builder.setSourceRectHint(sourceRect)\n }\n\n if (Build.VERSION.SDK_INT \u003e= Build.VERSION_CODES.S) {\n builder.setAutoEnterEnabled(shouldEnterPipMode)\n }\n context.findActivity().setPictureInPictureParams(builder.build())\n}\n\nVideoPlayer(pipModifier)https://github.com/android/snippets/blob/f95ab59fad80aeaf5d6a90bab8a01a126f20f44e/compose/snippets/src/main/java/com/example/compose/snippets/pictureinpicture/PictureInPictureSnippets.kt#L218-L233\n```\n\n\u003cbr /\u003e\n\n| **Note:** Depending on the video player you are using, you may need to reference the documentation and choose the `sourceRectHint` that represents the actual video content instead of the full video player."]]