Dans la balise d'activité de votre fichier AndroidManifest.xml
, procédez comme suit:
- Ajoutez
supportsPictureInPicture
et définissez-le surtrue
pour déclarer que vous utiliserez le mode PiP dans votre application. Ajoutez
configChanges
et définissez-le surorientation|screenLayout|screenSize|smallestScreenSize
pour spécifier que votre activité gère les modifications de configuration de la mise en page. De cette façon, votre activité ne se relance 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 fois 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 en quittant l'application pour les versions antérieures à Android 12
Pour ajouter la fonctionnalité PIP pour les versions antérieures à Android 12, utilisez addOnUserLeaveHintProvider
. Pour ajouter le mode PiP pour les versions antérieures à Android 12, procédez comme suit:
- Ajoutez une porte de version afin que ce code ne soit accessible que dans les versions O à R.
- Utilisez un
DisposableEffect
avecContext
comme clé. - Dans
DisposableEffect
, définissez le comportement lorsqueonUserLeaveHintProvider
est 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: () -> Unit = { 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 lorsque l'utilisateur quitte l'application pour Android 12 et versions ultérieures
Après Android 12, le PictureInPictureParams.Builder
est ajouté via un modificateur transmis au lecteur vidéo de l'application.
- Créez un
modifier
et appelezonGloballyPositioned
dessus. Les coordonnées de mise en page seront utilisées dans une prochaine étape. - Créez une variable pour le
PictureInPictureParams.Builder()
. - Ajoutez une instruction
if
pour vérifier si le SDK est S ou version ultérieure. Si tel est le cas, ajoutezsetAutoEnterEnabled
au générateur et définissez-le surtrue
pour passer en mode PiP lors du balayage. Cela offre une animation plus fluide que d'utiliserenterPictureInPictureMode
. - Utilisez
findActivity()
pour appelersetPictureInPictureParams()
. Appelezbuild()
surbuilder
et 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 le format de la fenêtre PiP
Pour définir le format de la fenêtre PiP, vous pouvez choisir un format spécifique ou utiliser la largeur et la hauteur de la taille vidéo du lecteur. Si vous utilisez un lecteur media3, vérifiez que le lecteur n'est pas nul et que sa taille vidéo n'est pas égale à [VideoSize.UNKNOWN
][6] 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 dépasse les limites valides du format, votre application plantera. Vous devrez peut-être ajouter des vérifications pour savoir quand le format peut être calculé, comme c'est le cas pour un lecteur media3.