Führen Sie im Aktivitäts-Tag der Datei AndroidManifest.xml folgende Schritte aus:
- Fügen Sie
supportsPictureInPicturehinzu und legen Sie den Wert auftruefest, um anzugeben, dass Sie in Ihrer App „Bild im Bild“ (BiB) verwenden. - Fügen Sie
configChangeshinzu und legen Sie den Wert auforientation|screenLayout|screenSize|smallestScreenSizefest, um anzugeben, dass Ihre Aktivität Änderungen an der Layoutkonfiguration verarbeitet. So wird Ihre Aktivität nicht neu gestartet, wenn sich das Layout während des Übergangs in den PiP-Modus ändert.
<activity
android:name=".SnippetsActivity"
android:exported="true"
android:supportsPictureInPicture="true"
android:configChanges="orientation|screenLayout|screenSize|smallestScreenSize"
android:theme="@style/Theme.Snippets">
Gehen Sie in Ihrem Compose-Code so vor:
- Fügen Sie diese Erweiterung auf
Contexthinzu. Sie werden diese Erweiterung im Laufe des Leitfadens mehrmals verwenden, um auf die Aktivität zuzugreifen.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") }
BiB beim Verlassen der App für Android-Versionen vor Android 12 hinzufügen
Wenn Sie BiB für Android-Versionen vor Android 12 hinzufügen möchten, verwenden Sie addOnUserLeaveHintProvider. So fügen Sie PiP für Android-Versionen vor Android 12 hinzu:
- Füge ein Versions-Gate hinzu, damit dieser Code nur in den Versionen O bis R aufgerufen wird.
- Verwenden Sie eine
DisposableEffectmitContextals Schlüssel. - Definieren Sie in
DisposableEffectdas Verhalten, wennonUserLeaveHintProvidermit einer Lambda-Funktion ausgelöst wird. Rufen Sie im LambdaenterPictureInPictureMode()fürfindActivity()auf und übergeben SiePictureInPictureParams.Builder().build(). - Fügen Sie
addOnUserLeaveHintListenermitfindActivity()hinzu und übergeben Sie den Lambda-Ausdruck. - Fügen Sie in
onDisposemitfindActivity()removeOnUserLeaveHintListenerhinzu und übergeben Sie den Lambda-Ausdruck.
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") }
BiB beim Verlassen der App für Android 12 und höher hinzufügen
Ab Android 12 wird die PictureInPictureParams.Builder über einen Modifikator hinzugefügt, der an den Videoplayer der App übergeben wird.
- Erstellen Sie einen
modifierund rufen SieonGloballyPositioneddafür auf. Die Layoutkoordinaten werden in einem späteren Schritt verwendet. - Erstellen Sie eine Variable für den
PictureInPictureParams.Builder(). - Fügen Sie eine
if-Anweisung hinzu, um zu prüfen, ob das SDK S oder höher ist. Füge in diesem FallsetAutoEnterEnabledzum Builder hinzu und setze den Wert auftrue, um beim Wischen in den PiP-Modus zu wechseln. Dadurch wird eine flüssigere Animation als beienterPictureInPictureModeerzielt. - Verwende
findActivity(), umsetPictureInPictureParams()anzurufen. Rufen Siebuild()fürbuilderauf und übergeben Sie das Ergebnis.
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)
Mit setAspectRatio das Seitenverhältnis des PiP-Fensters festlegen
Wenn du das Seitenverhältnis des PiP-Fensters festlegen möchtest, kannst du entweder ein bestimmtes Seitenverhältnis auswählen oder die Breite und Höhe der Videogröße des Players verwenden. Wenn du einen Media3-Player verwendest, prüfe, ob der Player nicht null ist und die Videogröße des Players nicht VideoSize.UNKNOWN entspricht, bevor du das Seitenverhältnis festlegst.
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)
Wenn Sie einen benutzerdefinierten Player verwenden, legen Sie das Seitenverhältnis für die Höhe und Breite des Players mit der für Ihren Player spezifischen Syntax fest. Wenn die Größe des Players während der Initialisierung geändert wird und die gültigen Grenzen des Seitenverhältnisses überschritten werden, stürzt die App ab. Möglicherweise müssen Sie Prüfungen hinzufügen, um festzustellen, wann das Seitenverhältnis berechnet werden kann, ähnlich wie bei einem Media3-Player.