اکشن های راه دور را به PiP اضافه کنید

اگر می‌خواهید کنترل‌هایی (پخش، مکث و غیره) را به پنجره PiP خود اضافه کنید، برای هر کنترلی که می‌خواهید اضافه کنید، یک 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)

مراحل بعدی

  • برای مشاهده بهترین شیوه های Compose PiP در عمل، به برنامه Socialite مراجعه کنید.
  • برای اطلاعات بیشتر به راهنمای طراحی PiP مراجعه کنید.
،

اگر می‌خواهید کنترل‌هایی (پخش، مکث و غیره) را به پنجره PiP خود اضافه کنید، برای هر کنترلی که می‌خواهید اضافه کنید، یک 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)

مراحل بعدی

  • برای مشاهده بهترین شیوه های Compose PiP در عمل، به برنامه Socialite مراجعه کنید.
  • برای اطلاعات بیشتر به راهنمای طراحی PiP مراجعه کنید.
،

اگر می‌خواهید کنترل‌هایی (پخش، مکث و غیره) را به پنجره PiP خود اضافه کنید، برای هر کنترلی که می‌خواهید اضافه کنید، یک 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)

مراحل بعدی

  • برای مشاهده بهترین شیوه های Compose PiP در عمل، به برنامه Socialite مراجعه کنید.
  • برای اطلاعات بیشتر به راهنمای طراحی PiP مراجعه کنید.
،

اگر می‌خواهید کنترل‌هایی (پخش، مکث و غیره) را به پنجره PiP خود اضافه کنید، برای هر کنترلی که می‌خواهید اضافه کنید، یک 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)

مراحل بعدی

  • برای مشاهده بهترین شیوه های Compose PiP در عمل، به برنامه Socialite مراجعه کنید.
  • برای اطلاعات بیشتر به راهنمای طراحی PiP مراجعه کنید.