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

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

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

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

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

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

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

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

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

fun releasePlayer() {
    shouldEnterPipMode = false
}

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

  1. Android 12 से पहले के वर्शन में पीआईपी मोड जोड़ने के लिए, 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")
    }

स्टेट का इस्तेमाल करके यह तय करें कि पीआईपी मोड चालू है या नहीं (Android 12 के बाद के वर्शन के लिए)

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

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

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