आपके ऐप्लिकेशन को इन स्थितियों में पीआईपी मोड में नहीं जाना चाहिए:
- वीडियो को रोका गया है या नहीं.
- अगर आप वीडियो प्लेयर के बजाय ऐप्लिकेशन के किसी दूसरे पेज पर हैं.
आपका ऐप्लिकेशन पीआईपी मोड में कब जाए, इसे कंट्रोल करने के लिए एक वैरिएबल जोड़ें. यह वैरिएबल, mutableStateOf का इस्तेमाल करके वीडियो प्लेयर की स्थिति को ट्रैक करता है.
वीडियो चलने के आधार पर, स्थिति को टॉगल करें
वीडियो प्लेयर चल रहा है या नहीं, इसके आधार पर स्थिति को टॉगल करने के लिए, वीडियो प्लेयर पर एक लिसनर जोड़ें. स्टेट वैरिएबल की स्थिति को इस आधार पर टॉगल करें कि प्लेयर वीडियो चला रहा है या नहीं:
player.addListener(object : Player.Listener { override fun onIsPlayingChanged(isPlaying: Boolean) { shouldEnterPipMode = isPlaying } })
प्लेयर के रिलीज़ होने के आधार पर, टॉगल की स्थिति
जब प्लेयर रिलीज़ हो जाए, तो अपने स्टेट वैरिएबल को false पर सेट करें:
fun releasePlayer() { shouldEnterPipMode = false }
स्टेट का इस्तेमाल करके यह तय करना कि पीआईपी मोड चालू है या नहीं (Android 12 से पहले के वर्शन के लिए)
- Android 12 से पहले के वर्शन में पीआईपी मोड जोड़ने के लिए,
DisposableEffectका इस्तेमाल किया जाता है. इसलिए, आपकोrememberUpdatedStateका इस्तेमाल करके एक नया वैरिएबल बनाना होगा. इसमेंnewValueको स्टेट वैरिएबल के तौर पर सेट करना होगा. इससे यह पक्का होगा कि अपडेट किए गए वर्शन का इस्तेमाल,DisposableEffectमें किया जाए. 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 और इसके बाद के वर्शन में, यह पीआईपी मोड से बाहर निकलने के लिए एक आसान ऐनिमेशन भी बनाता है.
इस एपीआई को पीआईपी बिल्डर में जोड़ें, ताकि गतिविधि के उस हिस्से को दिखाया जा सके जो पीआईपी में ट्रांज़िशन के बाद दिखता है.
setSourceRectHint()कोbuilderमें सिर्फ़ तब जोड़ें, जब स्टेट यह तय करे कि ऐप्लिकेशन को पीआईपी मोड में जाना चाहिए. इससे, ऐप्लिकेशन को पीआईपी मोड में जाने की ज़रूरत न होने पर,sourceRectका हिसाब लगाने से बचा जा सकता है.sourceRectवैल्यू सेट करने के लिए, मॉडिफ़ायर परonGloballyPositionedफ़ंक्शन से मिलेlayoutCoordinatesका इस्तेमाल करें.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)