L'app non deve entrare in modalità PiP nelle seguenti situazioni:
- Se il video è fermo o in pausa.
- Se non sei nella pagina del video player dell'app.
Per controllare quando l'app entra in modalità PiP, aggiungi una variabile che monitori lo stato del video player utilizzando un mutableStateOf.
Attiva/disattiva lo stato in base alla riproduzione del video
Per attivare/disattivare lo stato in base alla riproduzione del video player, aggiungi un ascoltatore sul video player. Attiva/disattiva lo stato della variabile di stato in base al fatto che il giocatore sia o meno in riproduzione:
player.addListener(object : Player.Listener { override fun onIsPlayingChanged(isPlaying: Boolean) { shouldEnterPipMode = isPlaying } })
Attiva/disattiva lo stato in base al rilascio del giocatore
Quando il player viene rilasciato, imposta la variabile di stato su false:
fun releasePlayer() { shouldEnterPipMode = false }
Utilizza lo stato per definire se è stata attivata la modalità PiP (versioni precedenti ad Android 12)
- Poiché l'aggiunta di PiP prima della versione 12 utilizza un
DisposableEffect, devi creare una nuova variabile tramiterememberUpdatedStateconnewValueimpostato come variabile di stato. In questo modo, la versione aggiornata verrà utilizzata inDisposableEffect. Nella funzione lambda che definisce il comportamento quando viene attivato
OnUserLeaveHintListener, aggiungi un'istruzioneifcon la variabile di stato intorno alla chiamata aenterPictureInPictureMode():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 = 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") }
Utilizza lo stato per definire se è stata attivata la modalità PiP (dopo Android 12)
Passa la variabile di stato a setAutoEnterEnabled in modo che l'app entri in modalità PiP solo al momento giusto:
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)
Utilizza setSourceRectHint per implementare un'animazione fluida
L'API setSourceRectHint crea un'animazione più fluida per accedere alla modalità PiP. In Android 12 e versioni successive, crea anche un'animazione più fluida per uscire dalla modalità PiP.
Aggiungi questa API al generatore di PiP per indicare l'area dell'attività visibile dopo la transizione in PiP.
- Aggiungi
setSourceRectHint()abuildersolo se lo stato definisce che l'app deve entrare in modalità PiP. In questo modo si evita di calcolaresourceRectquando l'app non deve entrare in PiP. - Per impostare il valore
sourceRect, utilizza i valorilayoutCoordinatesforniti dalla funzioneonGloballyPositionedsul modificatore. - Chiama
setSourceRectHint()subuildere passa la variabilesourceRect.
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)