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

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

  • अगर वीडियो रोका गया है या कुछ समय के लिए रोका गया है.
  • अगर आप ऐप्लिकेशन के वीडियो प्लेयर पेज के बजाय किसी दूसरे पेज पर हैं.

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

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

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

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

प्लेयर रिलीज़ होने पर, टॉगल करके स्टेटस बदलना

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

fun releasePlayer() {
    shouldEnterPipMode = false
}

Android 12 से पहले के वर्शन में, PiP मोड चालू है या नहीं, यह तय करने के लिए स्टेटस का इस्तेमाल करना

  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: () -> Unit = {
                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")
    }

Android 12 के बाद, PiP मोड चालू है या नहीं, यह तय करने के लिए स्टेटस का इस्तेमाल करें

अपने स्टेट वैरिएबल को 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 एपीआई, पिक्चर में पिक्चर मोड में जाने के लिए बेहतर ऐनिमेशन बनाता है. Android 12 और उसके बाद के वर्शन में, यह PiP मोड से बाहर निकलने के लिए भी बेहतर ऐनिमेशन बनाता है. इस एपीआई को PiP बिल्डर में जोड़ें, ताकि PiP में ट्रांज़िशन के बाद दिखने वाली गतिविधि के हिस्से की जानकारी मिल सके.

  1. builder में setSourceRectHint() सिर्फ़ तब जोड़ें, जब स्टेटस में यह तय किया गया हो कि ऐप्लिकेशन को PiP मोड में जाना चाहिए. इससे, ऐप्लिकेशन को PiP मोड में जाने की ज़रूरत न होने पर, sourceRect का हिसाब नहीं लगाया जाता.
  2. sourceRect वैल्यू सेट करने के लिए, मॉडिफ़ायर पर onGloballyPositioned फ़ंक्शन से मिले layoutCoordinates का इस्तेमाल करें.
  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)