افزودن کنش‌های کنترل از دور به «تصویردرتصویر»

اگر می‌خواهید کنترل‌هایی (پخش، مکث، و غیره) به پنجره «تصویردرتصویر» اضافه کنید، برای هر کنترلی که می‌خواهید اضافه کنید، RemoteAction ایجاد کنید.

  1. ثابت‌ها را برای کنترل‌های همه‌فرستی خود اضافه کنید:
    // 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
  2. فهرستی از RemoteActions برای کنترل‌های پنجره PiP خود ایجاد کنید.
  3. سپس، BroadcastReceiver و ملغی کردن onReceive() را اضافه کنید تا کنش‌های هر دکمه را تنظیم کنید. برای ثبت گیرنده و کنش‌های از دور، از DisposableEffect استفاده کنید. وقتی پخش‌کننده دور انداخته می‌شود، گیرنده را لغو ثبت کنید.
    @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)
            }
        }
    }
  4. فهرستی از کنش‌های از دور خود را به 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)

مراحل بعدی

  • برای دیدن روال‌های مطلوب «نوشتن PiP» در عمل، برنامه Socialite را ببینید.
  • برای اطلاعات بیشتر، راهنمای طراحی PiP را ببینید.