Wenn Sie Ihrem Bild-im-Bild-Fenster Steuerelemente (Wiedergabe, Pause usw.) hinzufügen möchten, erstellen Sie eine
RemoteAction für jedes Steuerelement, das Sie hinzufügen möchten.
- Fügen Sie Konstanten für Ihre Übertragungssteuerelemente hinzu:
// Constant for broadcast receiver const val ACTION_BROADCAST_CONTROL = "broadcast_control" // Intent extras for broadcast controls from Picture-in-Picture mode. const val EXTRA_CONTROL_TYPE = "control_type" const val EXTRA_CONTROL_PLAY = 1 const val EXTRA_CONTROL_PAUSE = 2
- Erstellen Sie eine Liste von
RemoteActionsfür die Steuerelemente in Ihrem Bild-im-Bild-Fenster. - Fügen Sie als Nächstes einen
BroadcastReceiverhinzu und überschreiben SieonReceive(), um die Aktionen der einzelnen Schaltflächen festzulegen. Verwenden Sie einenDisposableEffect, um den Empfänger und die Remoteaktionen zu registrieren. Wenn der Player verworfen wird, heben Sie die Registrierung des Empfängers auf.@RequiresApi(Build.VERSION_CODES.O) @Composable fun PlayerBroadcastReceiver(player: Player?) { val isInPipMode = rememberIsInPipMode() if (!isInPipMode || player == null) { // Broadcast receiver is only used if app is in PiP mode and player is non null return } val context = LocalContext.current DisposableEffect(player) { val broadcastReceiver: BroadcastReceiver = object : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { if ((intent == null) || (intent.action != ACTION_BROADCAST_CONTROL)) { return } when (intent.getIntExtra(EXTRA_CONTROL_TYPE, 0)) { EXTRA_CONTROL_PAUSE -> player.pause() EXTRA_CONTROL_PLAY -> player.play() } } } ContextCompat.registerReceiver( context, broadcastReceiver, IntentFilter(ACTION_BROADCAST_CONTROL), ContextCompat.RECEIVER_NOT_EXPORTED ) onDispose { context.unregisterReceiver(broadcastReceiver) } } }
- Übergeben Sie eine Liste Ihrer Remoteaktionen an die
PictureInPictureParams.Builder:val context = LocalContext.current val pipModifier = modifier.onGloballyPositioned { layoutCoordinates -> val builder = PictureInPictureParams.Builder() builder.setActions( listOfRemoteActions() ) 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(modifier = pipModifier)
Nächste Schritte
- In der Socialite-App sehen Sie die Best Practices für Compose PiP in Aktion.
- Weitere Informationen finden Sie in den Designrichtlinien für PiP.