सही समय पर पिन किया गया वीडियो

इन स्थितियों में, आपका ऐप्लिकेशन PiP मोड में नहीं जाना चाहिए:

  • अगर वीडियो रोका गया हो या उसे पॉज़ किया गया हो.
  • अगर आप वीडियो प्लेयर के अलावा, ऐप्लिकेशन के किसी दूसरे पेज पर हों.

यह कंट्रोल करने के लिए कि आपका ऐप्लिकेशन कब PiP मोड में जाए, एक वैरिएबल जोड़ें. यह वैरिएबल, वीडियो प्‍लेयर की स्थिति को ट्रैक करता है. इसके लिए, mutableStateOfका इस्तेमाल करें.

वीडियो चल रहा है या नहीं, इसके आधार पर स्थिति को टॉगल करना

वीडियो प्लेयर चल रहा है या नहीं, इसके आधार पर स्थिति को टॉगल करने के लिए, वीडियो प्लेयर पर एक लिसनर जोड़ें. प्लेयर चल रहा है या नहीं, इसके आधार पर अपने स्टेट वैरिएबल की स्थिति को टॉगल करें:

player.addListener(object : Player.Listener {
    override fun onIsPlayingChanged(isPlaying: Boolean) {
        shouldEnterPipMode = isPlaying
    }
})

प्लेयर रिलीज़ किया गया है या नहीं, इसके आधार पर स्थिति को टॉगल करना

प्लेयर रिलीज़ होने पर, अपने स्टेट वैरिएबल को false पर सेट करें:

fun releasePlayer() {
    shouldEnterPipMode = false
}

यह तय करने के लिए कि PiP मोड में कब जाना है, स्टेट का इस्तेमाल करना (Android 12 से पहले के वर्शन के लिए)

  1. Android 12 से पहले के वर्शन में PiP मोड जोड़ने के लिए, DisposableEffect का इस्तेमाल किया जाता है. इसलिए, आपको rememberUpdatedState का इस्तेमाल करके एक नया वैरिएबल बनाना होगा. इसमें newValue को अपने स्टेट वैरिएबल के तौर पर सेट करना होगा. इससे यह पक्का होगा कि DisposableEffect में अपडेट किया गया वर्शन इस्तेमाल किया जाए.
  2. OnUserLeaveHintListener ट्रिगर होने पर, व्यवहार तय करने वाले लैम्डा में, enterPictureInPictureMode() पर कॉल के आस-पास स्टेट वैरिएबल के साथ एक if स्टेटमेंट जोड़ें:

    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")
    }

यह तय करने के लिए कि PiP मोड में कब जाना है, स्टेट का इस्तेमाल करना (Android 12 और इसके बाद के वर्शन के लिए)

setAutoEnterEnabled में अपना स्टेट वैरिएबल पास करें, ताकि आपका ऐप्लिकेशन सिर्फ़ सही समय पर PiP मोड में जाए:

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)

स्मूद ऐनिमेशन के लिए, setSourceRectHint का इस्तेमाल करना

setSourceRectHint API की मदद से, PiP मोड में जाने के लिए ज़्यादा स्मूद ऐनिमेशन बनाया जा सकता है. Android 12 और इसके बाद के वर्शन में, इससे PiP मोड से बाहर निकलने के लिए भी ज़्यादा स्मूद ऐनिमेशन बनाया जा सकता है. PiP बिल्डर में यह API जोड़ें, ताकि यह बताया जा सके कि PiP मोड में ट्रांज़िशन के बाद, गतिविधि का कौनसा हिस्सा दिखता है.

  1. builder में सिर्फ़ तब setSourceRectHint() जोड़ें, जब स्टेट से यह पता चलता हो कि ऐप्लिकेशन को PiP मोड में जाना चाहिए. इससे, sourceRect की वैल्यू तब कैलकुलेट नहीं करनी पड़ती, जब ऐप्लिकेशन को PiP मोड में जाने की ज़रूरत नहीं होती.
  2. sourceRect की वैल्यू सेट करने के लिए, layoutCoordinates का इस्तेमाल करें. ये वैल्यू, मॉडिफ़ायर पर मौजूद onGloballyPositioned फ़ंक्शन से मिलती हैं.
  3. builder पर setSourceRectHint() को कॉल करें और इसमें sourceRect वैरिएबल पास करें.

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)