Dans la balise d'activité de votre fichier AndroidManifest.xml, procédez comme suit :
- Ajoutez supportsPictureInPictureet définissez-le surtruepour déclarer que vous utiliserez le mode Picture-in-picture (PIP) dans votre application.
- Ajoutez configChangeset définissez-le surorientation|screenLayout|screenSize|smallestScreenSizepour spécifier que votre activité gère les modifications de configuration de la mise en page. Ainsi, votre activité ne redémarre pas lorsque des modifications de mise en page se produisent lors des transitions en mode PIP.
<activity
    android:name=".SnippetsActivity"
    android:exported="true"
    android:supportsPictureInPicture="true"
    android:configChanges="orientation|screenLayout|screenSize|smallestScreenSize"
    android:theme="@style/Theme.Snippets">
Dans votre code Compose, procédez comme suit :
- Ajoutez cette extension sur Context. Vous utiliserez cette extension à plusieurs reprises tout au long du guide pour accéder à l'activité.internal fun Context.findActivity(): ComponentActivity { var context = this while (context is ContextWrapper) { if (context is ComponentActivity) return context context = context.baseContext } throw IllegalStateException("Picture in picture should be called in the context of an Activity") } 
Ajouter le mode PIP à l'application Leave pour les versions antérieures à Android 12
Pour ajouter le mode PIP pour les versions antérieures à Android 12, utilisez addOnUserLeaveHintProvider. Pour ajouter le mode PIP pour les versions antérieures à Android 12 :
- Ajoutez un version gate pour que ce code ne soit accessible que dans les versions O à R.
- Utilisez un DisposableEffectavecContextcomme clé.
- Dans DisposableEffect, définissez le comportement lorsqueonUserLeaveHintProviderest déclenché à l'aide d'un lambda. Dans le lambda, appelezenterPictureInPictureMode()surfindActivity()et transmettezPictureInPictureParams.Builder().build().
- Ajoutez addOnUserLeaveHintListenerà l'aide defindActivity()et transmettez le lambda.
- Dans onDispose, ajoutezremoveOnUserLeaveHintListenerà l'aide defindActivity()et transmettez le lambda.
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 = Runnable { 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") }
Ajouter le mode PIP à l'application Leave pour les versions d'Android ultérieures à la version 12
Après Android 12, le PictureInPictureParams.Builder est ajouté via un modificateur transmis au lecteur vidéo de l'application.
- Créez un modifieret appelezonGloballyPositioneddessus. Les coordonnées de la mise en page seront utilisées lors d'une prochaine étape.
- Créez une variable pour PictureInPictureParams.Builder().
- Ajoutez une instruction ifpour vérifier si le SDK est S ou version ultérieure. Si tel est le cas, ajoutezsetAutoEnterEnabledau compilateur et définissez-le surtruepour passer en mode PIP lors du balayage. Cela permet d'obtenir une animation plus fluide que celle obtenue avecenterPictureInPictureMode.
- Utilisez findActivity()pour appelersetPictureInPictureParams(). Appelezbuild()surbuilderet transmettez-le.
val pipModifier = modifier.onGloballyPositioned { layoutCoordinates -> val builder = PictureInPictureParams.Builder() if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { builder.setAutoEnterEnabled(true) } context.findActivity().setPictureInPictureParams(builder.build()) } VideoPlayer(pipModifier)
Utiliser setAspectRatio pour définir les proportions de la fenêtre PIP
Pour définir les proportions de la fenêtre PIP, vous pouvez choisir des proportions spécifiques ou utiliser la largeur et la hauteur de la taille de la vidéo du lecteur. Si vous utilisez un lecteur Media3, vérifiez que le lecteur n'est pas nul et que la taille de la vidéo du lecteur n'est pas égale à VideoSize.UNKNOWN avant de définir le format.
val context = LocalContext.current val pipModifier = modifier.onGloballyPositioned { layoutCoordinates -> val builder = PictureInPictureParams.Builder() if (shouldEnterPipMode && player != null && player.videoSize != VideoSize.UNKNOWN) { val sourceRect = layoutCoordinates.boundsInWindow().toAndroidRectF().toRect() builder.setSourceRectHint(sourceRect) builder.setAspectRatio( Rational(player.videoSize.width, player.videoSize.height) ) } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { builder.setAutoEnterEnabled(shouldEnterPipMode) } context.findActivity().setPictureInPictureParams(builder.build()) } VideoPlayer(pipModifier)
Si vous utilisez un lecteur personnalisé, définissez le format sur la hauteur et la largeur du lecteur à l'aide de la syntaxe spécifique à votre lecteur. Sachez que si votre lecteur est redimensionné lors de l'initialisation et qu'il sort des limites valides du format, votre application plantera. Vous devrez peut-être ajouter des vérifications pour déterminer quand le format peut être calculé, comme c'est le cas pour un lecteur Media3.
