Android 8.0 (एपीआई लेवल 26) से, Android में ऐक्टिविटी को पिक्चर में पिक्चर (पीआईपी) मोड में लॉन्च करने की अनुमति है. PiP, मल्टी-विंडो मोड का एक खास टाइप है. इसका इस्तेमाल वीडियो चलाने, वीडियो कॉल करने, और नेविगेशन के लिए किया जाता है. इस सुविधा की मदद से, उपयोगकर्ता मौजूदा गतिविधि वाली विंडो को स्क्रीन के किसी कोने पर पिन कर सकता है. ऐसा तब किया जा सकता है, जब वह ऐप्लिकेशन के बीच स्विच कर रहा हो या मुख्य स्क्रीन पर कॉन्टेंट ब्राउज़ कर रहा हो.
उपयोगकर्ता इंटरैक्शन के लिए रिज़र्व किया गया है.पीआईपी, Android 7.0 में उपलब्ध मल्टी-विंडो एपीआई का इस्तेमाल करता है, ताकि पिन की गई वीडियो ओवरले विंडो उपलब्ध कराई जा सके. अपने ऐप्लिकेशन में PiP मोड जोड़ने के लिए, आपको उन गतिविधियों को रजिस्टर करना होगा जो PiP मोड के साथ काम करती हैं. इसके बाद, ज़रूरत के मुताबिक अपनी गतिविधि को PiP मोड पर स्विच करना होगा. साथ ही, यह पक्का करना होगा कि गतिविधि PiP मोड में होने पर, यूज़र इंटरफ़ेस (यूआई) एलिमेंट छिपे हों और वीडियो चलता रहे.
PiP विंडो, स्क्रीन की सबसे ऊपर वाली लेयर में दिखती है. यह स्क्रीन के उस कोने में दिखती है जिसे सिस्टम चुनता है.
पीआईपी की सुविधा, Android TV OS पर काम करने वाले उन डिवाइसों पर भी उपलब्ध है जिनमें Android 14 (एपीआई लेवल 34) या इसके बाद का वर्शन है. दोनों में कई समानताएं हैं. हालांकि, टीवी पर PiP मोड का इस्तेमाल करते समय, कुछ और बातों का ध्यान रखना होता है.
उपयोगकर्ता, PiP विंडो के साथ कैसे इंटरैक्ट कर सकते हैं
उपयोगकर्ता, पीआईपी विंडो को किसी दूसरी जगह पर खींचकर छोड़ सकते हैं. Android 12 से, उपयोगकर्ता ये काम भी कर सकते हैं:
विंडो पर एक बार टैप करने से, फ़ुलस्क्रीन टॉगल, बंद करें बटन, सेटिंग बटन, और आपके ऐप्लिकेशन की ओर से उपलब्ध कराई गई कस्टम कार्रवाइयां दिखती हैं. उदाहरण के लिए, मीडिया चलाने के कंट्रोल.
विंडो पर दो बार टैप करके, मौजूदा पीआईपी साइज़ और ज़्यादा से ज़्यादा या कम से कम पीआईपी साइज़ के बीच टॉगल करें. उदाहरण के लिए, बड़ी की गई विंडो पर दो बार टैप करने से वह छोटी हो जाती है. इसी तरह, छोटी की गई विंडो पर दो बार टैप करने से वह बड़ी हो जाती है.
विंडो को बाईं या दाईं ओर खींचकर छोड़ें. विंडो को वापस लाने के लिए, छिपाई गई विंडो के दिखने वाले हिस्से पर टैप करें या उसे खींचकर बाहर लाएं.
पिंच करके ज़ूम करने की सुविधा का इस्तेमाल करके, पीआईपी विंडो का साइज़ बदलें.
आपका ऐप्लिकेशन यह कंट्रोल करता है कि मौजूदा गतिविधि को PiP मोड में कब ले जाना है. यहाँ कुछ उदाहरण दिए गए हैं:
जब उपयोगकर्ता होम बटन पर टैप करता है या होम स्क्रीन पर ऊपर की ओर स्वाइप करता है, तब कोई गतिविधि PiP मोड में आ सकती है. इस तरह, Google Maps उपयोगकर्ता को निर्देश दिखाता रहता है, जबकि वह उसी समय कोई दूसरी गतिविधि करता है.
जब उपयोगकर्ता वीडियो से वापस जाकर कोई दूसरा कॉन्टेंट ब्राउज़ करता है, तब आपका ऐप्लिकेशन वीडियो को पीआईपी मोड में ले जा सकता है.
जब कोई व्यक्ति कॉन्टेंट के किसी एपिसोड के आखिर में पहुंचता है, तब आपका ऐप्लिकेशन वीडियो को पीआईपी मोड में स्विच कर सकता है. मुख्य स्क्रीन पर, सीरीज़ के अगले एपिसोड के बारे में प्रमोशन या खास जानकारी दिखती है.
आपका ऐप्लिकेशन, उपयोगकर्ताओं को वीडियो देखते समय अन्य कॉन्टेंट को कतार में लगाने की सुविधा दे सकता है. मुख्य स्क्रीन पर कॉन्टेंट चुनने की गतिविधि के दौरान, वीडियो PiP मोड में चलता रहता है.
पीआईपी मोड की सुविधा के बारे में जानकारी देना
डिफ़ॉल्ट रूप से, सिस्टम ऐप्लिकेशन के लिए PiP मोड को अपने-आप चालू नहीं करता. अगर आपको अपने ऐप्लिकेशन में PiP मोड की सुविधा देनी है, तो अपने मेनिफ़ेस्ट में वीडियो गतिविधि रजिस्टर करें. इसके लिए, android:supportsPictureInPicture को true पर सेट करें. यह भी बताएं कि आपकी ऐक्टिविटी, लेआउट कॉन्फ़िगरेशन में होने वाले बदलावों को मैनेज करती है. इससे, PiP मोड में ट्रांज़िशन के दौरान लेआउट में बदलाव होने पर, आपकी ऐक्टिविटी फिर से लॉन्च नहीं होगी.
<activity android:name="VideoActivity"
android:supportsPictureInPicture="true"
android:configChanges=
"screenSize|smallestScreenSize|screenLayout|orientation"
...
Jetpack की मदद से पीआईपी सुविधा लागू करना
Jetpack Picture-in-Picture लाइब्रेरी का इस्तेमाल करके, पिक्चर में पिक्चर की सुविधा लागू करें. इससे इंटिग्रेशन को आसान बनाने और ऐप्लिकेशन में होने वाली सामान्य समस्याओं को कम करने में मदद मिलती है. इसके इस्तेमाल का उदाहरण देखने के लिए, हमारे प्लैटफ़ॉर्म के सैंपल ऐप्लिकेशन पर जाएं. हालांकि, अगर आपको प्लैटफ़ॉर्म एपीआई का इस्तेमाल करके पीआईपी मोड लागू करना है, तो यह दस्तावेज़ पढ़ें.
वीडियो को PiP मोड में स्विच करना
Android 12 और उसके बाद के वर्शन में, setAutoEnterEnabled फ़्लैग को true पर सेट करके, अपनी गतिविधि को पीआईपी मोड पर स्विच किया जा सकता है. इस सेटिंग की मदद से, किसी गतिविधि को ज़रूरत के हिसाब से पीआईपी मोड में अपने-आप स्विच किया जा सकता है. इसके लिए, आपको onUserLeaveHint में enterPictureInPictureMode() को साफ़ तौर पर कॉल करने की ज़रूरत नहीं होती. इससे ट्रांज़िशन को ज़्यादा आसानी से मैनेज किया जा सकता है. ज़्यादा जानकारी के लिए, जेस्चर वाले नेविगेशन के दौरान, पीआईपी मोड में आसानी से ट्रांज़िशन करना लेख पढ़ें.
अगर Android 11 या इससे पहले के वर्शन को टारगेट किया जा रहा है, तो PiP मोड पर स्विच करने के लिए किसी गतिविधि को enterPictureInPictureMode() कॉल करना होगा. उदाहरण के लिए, यहां दिया गया कोड, उपयोगकर्ता के ऐप्लिकेशन के यूज़र इंटरफ़ेस (यूआई) में मौजूद किसी बटन पर क्लिक करने पर, गतिविधि को पीआईपी मोड में स्विच कर देता है:
override fun onActionClicked(action: Action) {
if (action.id.toInt() == R.id.lb_control_picture_in_picture) {
activity?.enterPictureInPictureMode()
return
}
}
आपको ऐसा लॉजिक शामिल करना पड़ सकता है जो गतिविधि को बैकग्राउंड में ले जाने के बजाय, PiP मोड में स्विच कर दे. उदाहरण के लिए, अगर उपयोगकर्ता Google Maps का इस्तेमाल करते समय होम या रीसेंट बटन दबाता है, तो Google Maps पीआईपी मोड में स्विच हो जाता है. onUserLeaveHint() को बदलकर, इस मामले को पकड़ा जा सकता है:
override fun onUserLeaveHint() {
if (iWantToBeInPipModeNow()) {
enterPictureInPictureMode()
}
}
सुझाया गया: उपयोगकर्ताओं को बेहतर PiP ट्रांज़िशन का अनुभव दें
Android 12 में, फ़ुलस्क्रीन और PiP विंडो के बीच ऐनिमेशन वाले ट्रांज़िशन में काफ़ी सुधार किए गए हैं. हमारा सुझाव है कि आप सभी ज़रूरी बदलाव लागू करें. ऐसा करने के बाद, ये बदलाव अपने-आप बड़ी स्क्रीन वाले डिवाइसों, जैसे कि फ़ोल्ड किए जा सकने वाले फ़ोन और टैबलेट पर लागू हो जाएंगे. इसके लिए, आपको कुछ और करने की ज़रूरत नहीं होगी.
अगर आपके ऐप्लिकेशन में ज़रूरी अपडेट शामिल नहीं हैं, तो पीआईपी ट्रांज़िशन की सुविधा अब भी काम करेगी. हालांकि, ऐनिमेशन पहले से कम बेहतर होंगे. उदाहरण के लिए, फ़ुलस्क्रीन से पीआईपी मोड पर ट्रांज़िशन करने पर, पीआईपी विंडो ट्रांज़िशन के दौरान गायब हो सकती है. ट्रांज़िशन पूरा होने के बाद, यह फिर से दिखती है.
इन बदलावों में ये शामिल हैं.
- हाथ के जेस्चर (स्पर्श) वाले नेविगेशन से पीआईपी मोड में ट्रांज़िशन को ज़्यादा आसान बनाया गया है
- पीआईपी मोड में जाने और इससे बाहर निकलने के लिए, सही
sourceRectHintसेट करना - वीडियो के अलावा अन्य कॉन्टेंट के लिए, बिना किसी रुकावट के साइज़ बदलने की सुविधा बंद करना
बेहतर ट्रांज़िशन अनुभव को चालू करने के लिए, Android Kotlin PictureInPicture सैंपल देखें.
हाथ के जेस्चर (स्पर्श) वाले नेविगेशन से पीआईपी मोड में आसानी से स्विच करना
Android 12 से, setAutoEnterEnabled फ़्लैग की मदद से, जेस्चर नेविगेशन का इस्तेमाल करके पीआईपी मोड में वीडियो कॉन्टेंट पर स्विच करने के लिए, ज़्यादा स्मूद ऐनिमेशन मिलता है. उदाहरण के लिए, फ़ुलस्क्रीन से होम स्क्रीन पर ऊपर की ओर स्वाइप करते समय.
यह बदलाव करने के लिए, यह तरीका अपनाएं:
PictureInPictureParams.Builderबनाने के लिए,setAutoEnterEnabledका इस्तेमाल करें:
setPictureInPictureParams(PictureInPictureParams.Builder()
.setAspectRatio(aspectRatio)
.setSourceRectHint(sourceRectHint)
.setAutoEnterEnabled(true)
.build())
Note: When `setAutoEnterEnabled` is enabled, you don't need to explicitly
call [`enterPictureInPictureMode`][5] in [`onUserLeaveHint`][6].
setPictureInPictureParamsको कॉल करके,PictureInPictureParamsके बारे में अप-टू-डेट जानकारी पाएं. ऐप्लिकेशन,onUserLeaveHintकॉलबैक का इंतज़ार नहीं करता है. ऐसा Android 11 में होता था.उदाहरण के लिए, अगर आसपेक्ट रेशियो (लंबाई-चौड़ाई का अनुपात) बदल दिया जाता है, तो हो सकता है कि आपको पहली बार वीडियो चलाने पर और उसके बाद वीडियो चलाने पर
setPictureInPictureParamsको कॉल करना पड़े.setAutoEnterEnabled(false)को कॉल करें, लेकिन सिर्फ़ तब, जब इसकी ज़रूरत हो. उदाहरण के लिए, अगर वीडियो को रोका गया है, तो शायद आपको पीआईपी मोड में नहीं जाना चाहिए.
PiP मोड में जाने और इससे बाहर निकलने के लिए, सही sourceRectHint सेट करें
Android 8.0 में पीआईपी मोड की सुविधा शुरू होने के बाद से, setSourceRectHint से गतिविधि के उस हिस्से का पता चलता है जो पिक्चर में पिक्चर मोड में ट्रांज़िशन के बाद दिखता है. उदाहरण के लिए, वीडियो प्लेयर में वीडियो व्यू बाउंड.
Android 12 में, सिस्टम sourceRectHint का इस्तेमाल करता है, ताकि पीआईपी मोड में जाने और उससे बाहर निकलने के दौरान, ऐनिमेशन ज़्यादा स्मूद हो.
PiP मोड में जाने और उससे बाहर निकलने के लिए, sourceRectHint को सही तरीके से सेट करने का तरीका:
- सही बाउंड का इस्तेमाल करके,
PictureInPictureParamsबनाएं. इसके लिए,sourceRectHintका इस्तेमाल करें. हमारा सुझाव है कि वीडियो प्लेयर में लेआउट बदलने वाले लिसनर को भी अटैच करें:
val mOnLayoutChangeListener =
OnLayoutChangeListener { v: View?, left: Int,
top: Int, right: Int, bottom: Int, oldLeft: Int, oldTop:
Int, oldRight: Int, oldBottom: Int ->
val sourceRectHint = Rect()
mYourVideoView.getGlobalVisibleRect(sourceRectHint)
val builder = PictureInPictureParams.Builder()
.setSourceRectHint(sourceRectHint)
setPictureInPictureParams(builder.build())
}
mYourVideoView.addOnLayoutChangeListener(mOnLayoutChangeListener)
- अगर ज़रूरी हो, तो सिस्टम के एक्ज़िट ट्रांज़िशन शुरू करने से पहले,
sourceRectHintको अपडेट करें. जब सिस्टम PiP मोड से बाहर निकलने वाला होता है, तब गतिविधि की व्यू हैरारकी को उसके डेस्टिनेशन कॉन्फ़िगरेशन (उदाहरण के लिए, फ़ुल स्क्रीन) के हिसाब से सेट किया जाता है. ऐप्लिकेशन, इवेंट का पता लगाने के लिए, लेआउट में बदलाव करने वाले लिसनर को अपनी रूट व्यू या टारगेट व्यू (जैसे, वीडियो प्लेयर व्यू) से अटैच कर सकता है. साथ ही, ऐनिमेशन शुरू होने से पहलेsourceRectHintको अपडेट कर सकता है.
// Listener is called immediately after the user exits PiP but before animating.
playerView.addOnLayoutChangeListener { _, left, top, right, bottom,
oldLeft, oldTop, oldRight, oldBottom ->
if (left != oldLeft
|| right != oldRight
|| top != oldTop
|| bottom != oldBottom) {
// The playerView's bounds changed, update the source hint rect to
// reflect its new bounds.
val sourceRectHint = Rect()
playerView.getGlobalVisibleRect(sourceRectHint)
setPictureInPictureParams(
PictureInPictureParams.Builder()
.setSourceRectHint(sourceRectHint)
.build()
)
}
}
वीडियो के अलावा दूसरे कॉन्टेंट के लिए, बिना किसी रुकावट के साइज़ बदलने की सुविधा बंद करना
Android 12 में setSeamlessResizeEnabled फ़्लैग जोड़ा गया है. इससे, PiP विंडो में वीडियो के अलावा अन्य कॉन्टेंट का साइज़ बदलते समय, क्रॉस-फ़ेडिंग ऐनिमेशन ज़्यादा स्मूद तरीके से काम करता है. इससे पहले, पीआईपी विंडो में वीडियो के अलावा अन्य कॉन्टेंट का साइज़ बदलने पर, विज़ुअल आर्टफ़ैक्ट दिख सकते थे.
वीडियो कॉन्टेंट के लिए, आसानी से साइज़ बदलने की सुविधा चालू करने के लिए:
setPictureInPictureParams(PictureInPictureParams.Builder()
.setSeamlessResizeEnabled(true)
.build())
पीआईपी मोड के दौरान यूज़र इंटरफ़ेस (यूआई) को मैनेज करना
जब ऐक्टिविटी, पिक्चर में पिक्चर (पीआईपी) मोड में जाती है या उससे बाहर निकलती है, तो सिस्टम Activity.onPictureInPictureModeChanged() या Fragment.onPictureInPictureModeChanged() को कॉल करता है.
Android 15 में कुछ बदलाव किए गए हैं. इनसे पीआईपी मोड में जाने पर, ट्रांज़िशन और भी आसानी से होता है. यह उन ऐप्लिकेशन के लिए फ़ायदेमंद है जिनके यूज़र इंटरफ़ेस (यूआई) एलिमेंट, मुख्य यूज़र इंटरफ़ेस (यूआई) के ऊपर ओवरले किए जाते हैं. यह मुख्य यूज़र इंटरफ़ेस (यूआई), पीआईपी में जाता है.
डेवलपर, onPictureInPictureModeChanged() कॉलबैक का इस्तेमाल करके, ऐसा लॉजिक तय करते हैं जो ओवरले किए गए यूज़र इंटरफ़ेस (यूआई) एलिमेंट की विज़िबिलिटी को टॉगल करता है. यह कॉलबैक तब ट्रिगर होता है, जब PiP मोड में जाने या उससे बाहर निकलने का ऐनिमेशन पूरा हो जाता है. Android 15 से, PictureInPictureUiState क्लास में एक नई स्थिति शामिल है.
यूज़र इंटरफ़ेस (यूआई) की इस नई स्थिति के साथ, Android 15 को टारगेट करने वाले ऐप्लिकेशन, Activity#onPictureInPictureUiStateChanged() कॉलबैक को isTransitioningToPip() के साथ इनवोक करते हैं. ऐसा पीआईपी ऐनिमेशन शुरू होते ही होता है. ऐसे कई यूज़र इंटरफ़ेस (यूआई) एलिमेंट होते हैं जो ऐप्लिकेशन के पीआईपी मोड में होने पर काम के नहीं होते. उदाहरण के लिए, ऐसे व्यू या लेआउट जिनमें सुझाव, आने वाला वीडियो, रेटिंग, और टाइटल जैसी जानकारी शामिल होती है. जब ऐप्लिकेशन PiP मोड में चला जाता है, तब इन यूज़र इंटरफ़ेस (यूआई) एलिमेंट को छिपाने के लिए, onPictureInPictureUiStateChanged() कॉलबैक का इस्तेमाल करें. जब ऐप्लिकेशन, पीआईपी विंडो से फ़ुल स्क्रीन मोड में जाता है, तब इन एलिमेंट को दिखाने के लिए onPictureInPictureModeChanged() कॉलबैक का इस्तेमाल करें. इसके बारे में यहां दिए गए उदाहरणों में बताया गया है:
override fun onPictureInPictureUiStateChanged(pipState: PictureInPictureUiState) {
if (pipState.isTransitioningToPip()) {
// Hide UI elements.
}
}
override fun onPictureInPictureModeChanged(
isInPictureInPictureMode: Boolean,
newConfig: Configuration
) {
super.onPictureInPictureModeChanged(isInPictureInPictureMode, newConfig)
if (!isInPictureInPictureMode) {
// Unhide UI elements.
}
}
यह सुविधा, पीआईपी विंडो के लिए काम के न होने वाले यूज़र इंटरफ़ेस (यूआई) एलिमेंट को तुरंत दिखाने या छिपाने की सुविधा देती है. इससे पीआईपी विंडो में वीडियो को आसानी से और बिना किसी रुकावट के चलाने में मदद मिलती है.
गतिविधि के यूज़र इंटरफ़ेस (यूआई) एलिमेंट को फिर से बनाने के लिए, इन कॉलबैक को बदलें. ध्यान रखें कि PiP मोड में, आपकी गतिविधि एक छोटी विंडो में दिखती है. जब ऐप्लिकेशन PiP मोड में होता है, तब उपयोगकर्ता आपके ऐप्लिकेशन के यूज़र इंटरफ़ेस (यूआई) एलिमेंट से इंटरैक्ट नहीं कर सकते. साथ ही, छोटे यूज़र इंटरफ़ेस (यूआई) एलिमेंट की जानकारी देखना मुश्किल हो सकता है. कम से कम यूज़र इंटरफ़ेस (यूआई) के साथ वीडियो चलाने की गतिविधियों से, उपयोगकर्ताओं को बेहतरीन अनुभव मिलता है.
अगर आपके ऐप्लिकेशन को पीआईपी के लिए कस्टम कार्रवाइयां उपलब्ध करानी हैं, तो इस पेज पर कंट्रोल जोड़ना लेख पढ़ें. आपकी गतिविधि के PiP मोड में जाने से पहले, अन्य यूज़र इंटरफ़ेस (यूआई) एलिमेंट हटा दें. साथ ही, जब आपकी गतिविधि फिर से फ़ुल स्क्रीन पर आ जाए, तब उन्हें वापस ले आएं.
कंट्रोल बटन जोड़ें
जब उपयोगकर्ता, पीआईपी विंडो का मेन्यू खोलता है, तब उसमें कंट्रोल दिख सकते हैं. इसके लिए, उसे मोबाइल डिवाइस पर विंडो पर टैप करना होगा या टीवी रिमोट से मेन्यू चुनना होगा.
अगर किसी ऐप्लिकेशन में मीडिया सेशन चालू है, तो चलाएं, रोकें, अगला, और पिछला कंट्रोल दिखेगा.
पीआईपी मोड में जाने से पहले, PictureInPictureParams के साथ PictureInPictureParams.Builder.setActions() को बनाकर, कस्टम कार्रवाइयां भी साफ़ तौर पर तय की जा सकती हैं. साथ ही, enterPictureInPictureMode(android.app.PictureInPictureParams) या setPictureInPictureParams(android.app.PictureInPictureParams) का इस्तेमाल करके, पीआईपी मोड में जाते समय पैरामीटर पास किए जा सकते हैं. ध्यान
रखें. अगर getMaxNumPictureInPictureActions() से ज़्यादा आइटम जोड़ने की कोशिश की जाती है, तो आपको सिर्फ़ getMaxNumPictureInPictureActions() आइटम दिखेंगे.
PiP मोड में वीडियो चलाते रहना
जब आपकी गतिविधि PiP मोड में स्विच होती है, तो सिस्टम गतिविधि को 'रोका गया' स्थिति में रखता है और गतिविधि के onPause() तरीके को कॉल करता है. पीआईपी मोड पर स्विच करते समय, गतिविधि को रोकने पर वीडियो नहीं रुकना चाहिए. इसके बजाय, वीडियो चलना जारी रहना चाहिए.
Android 7.0 (एपीआई लेवल 24) और इसके बाद के वर्शन में, सिस्टम के आपकी गतिविधि के onStop() और onStart() को कॉल करने पर, आपको वीडियो चलाने की सुविधा को रोकना और फिर से शुरू करना चाहिए. ऐसा करने से, आपको यह जांच करने की ज़रूरत नहीं पड़ती कि आपका ऐप्लिकेशन onPause() में PiP मोड में है या नहीं. साथ ही, आपको वीडियो चलाने की सुविधा को चालू रखने के लिए साफ़ तौर पर निर्देश देने की ज़रूरत नहीं पड़ती.
अगर आपने setAutoEnterEnabled फ़्लैग को true पर सेट नहीं किया है और आपको onPause() लागू करने के दौरान वीडियो चलाने की सुविधा को रोकना है, तो isInPictureInPictureMode() को कॉल करके PiP मोड की जांच करें और वीडियो चलाने की सुविधा को सही तरीके से मैनेज करें. उदाहरण के लिए:
override fun onPause() {
super.onPause()
// If called while in PiP mode, don't pause playback.
if (isInPictureInPictureMode) {
// Continue playback.
} else {
// Use existing playback logic for paused activity behavior.
}
}
जब आपकी गतिविधि, पीआईपी मोड से फ़ुल-स्क्रीन मोड पर वापस आ जाती है, तो सिस्टम आपकी गतिविधि को फिर से शुरू कर देता है. साथ ही, आपके onResume() तरीके को कॉल करता है.
PiP के लिए, एक ही प्लेबैक गतिविधि का इस्तेमाल करना
आपके ऐप्लिकेशन में, कोई उपयोगकर्ता मुख्य स्क्रीन पर कॉन्टेंट ब्राउज़ करते समय नया वीडियो चुन सकता है. ऐसा तब होता है, जब वीडियो चलाने की गतिविधि पीआईपी मोड में हो. नए वीडियो को फ़ुल स्क्रीन मोड में, मौजूदा वीडियो चलाने की गतिविधि में चलाएं. ऐसा करने से, नई गतिविधि लॉन्च नहीं होगी. इससे उपयोगकर्ता भ्रमित हो सकता है.
यह पक्का करने के लिए कि वीडियो चलाने के अनुरोधों के लिए एक ही गतिविधि का इस्तेमाल किया जाए और ज़रूरत के मुताबिक पीआईपी मोड में स्विच किया जाए या उससे बाहर निकला जाए, अपने मेनिफ़ेस्ट में गतिविधि के android:launchMode को singleTask पर सेट करें:
<activity android:name="VideoActivity"
...
android:supportsPictureInPicture="true"
android:launchMode="singleTask"
...
अपनी गतिविधि में, onNewIntent() को बदलें और नए वीडियो को हैंडल करें. साथ ही, ज़रूरत पड़ने पर मौजूदा वीडियो का प्लेबैक रोकें.
कैमरा ऐप्लिकेशन के लिए, Picture-in-Picture मोड की सुविधा
कैमरा ऐप्लिकेशन के लिए PiP मोड चालू करने के लिए, आपको यह पक्का करना होगा कि PiP मोड में कैमरा चालू रहे. इसके लिए, onPause() को कॉल करने पर कैमरा बंद न करें:
override fun onPause() {
super.onPause()
// Don't close the camera if the app is entering PiP mode
if (!isInPictureInPictureMode) {
closeCamera()
}
}
अन्य इस्तेमाल के उदाहरणों की तरह, गैर-ज़रूरी यूज़र इंटरफ़ेस (यूआई) एलिमेंट (जैसे, कंट्रोल और ओवरले) छिपाएं. साथ ही, कैमरे को कंट्रोल करने के लिए कस्टम कार्रवाइयां जोड़ें. उदाहरण के लिए, रिकॉर्डिंग बंद करना या कैमरा फ़्लिप करना.
स्मूद ट्रांज़िशन के लिए, sourceRectHint का हिसाब लगाना
कैमरे के व्यूफ़ाइंडर के सटीक स्क्रीन कोऑर्डिनेट के साथ सटीक sourceRectHint उपलब्ध कराना ज़रूरी है, ताकि ऐनिमेशन आसानी से शुरू हो सके. getGlobalVisibleRect() का इस्तेमाल करके, झलक दिखाने वाले व्यू से बाउंड्री की जानकारी इस तरह पाई जा सकती है:
val previewView = findViewById<View>(R.id.preview_view)
val globalRect = Rect()
// Ensure the view is laid out before calling getGlobalVisibleRect() to get valid screen coordinates.
previewView.getGlobalVisibleRect(globalRect)
val params = PictureInPictureParams.Builder()
.setSourceRectHint(globalRect)
.build()
setPictureInPictureParams(params)
ज़्यादा जानकारी
कम रैम वाले डिवाइसों पर, PiP की सुविधा बंद हो सकती है. ऐप्लिकेशन में पीआईपी मोड का इस्तेमाल करने से पहले, यह पक्का करें कि यह मोड उपलब्ध है. इसके लिए, hasSystemFeature(PackageManager.FEATURE_PICTURE_IN_PICTURE) को कॉल करें.
पीआईपी मोड का इस्तेमाल उन गतिविधियों के लिए किया जाता है जिनमें फ़ुल-स्क्रीन वीडियो चलाया जाता है. पीआईपी मोड में स्विच करते समय, वीडियो कॉन्टेंट के अलावा कुछ और न दिखाएं. ट्रैक करें कि आपकी गतिविधि कब PiP मोड में जाती है और यूज़र इंटरफ़ेस (यूआई) एलिमेंट को छिपाएं. इसके बारे में PiP मोड के दौरान यूज़र इंटरफ़ेस (यूआई) को मैनेज करना लेख में बताया गया है.
जब कोई गतिविधि पीआईपी मोड में होती है, तो डिफ़ॉल्ट रूप से उसे इनपुट फ़ोकस नहीं मिलता है. पीआईपी मोड में इनपुट इवेंट पाने के लिए, MediaSession.setCallback() का इस्तेमाल करें.
setCallback() का इस्तेमाल करने के बारे में ज़्यादा जानने के लिए, 'अभी चल रहा है' कार्ड दिखाना लेख पढ़ें.
जब आपका ऐप्लिकेशन पीआईपी मोड में होता है, तब पीआईपी विंडो में वीडियो चलाने से, किसी दूसरे ऐप्लिकेशन के ऑडियो में रुकावट आ सकती है. जैसे, म्यूज़िक प्लेयर ऐप्लिकेशन या बोलकर खोज करने वाला ऐप्लिकेशन. इससे बचने के लिए, वीडियो चलाना शुरू करते समय ऑडियो फ़ोकस का अनुरोध करें. साथ ही, ऑडियो फ़ोकस में बदलाव होने पर मिलने वाली सूचनाओं को मैनेज करें. इसके बारे में ऑडियो फ़ोकस मैनेज करना लेख में बताया गया है. अगर आपको PiP मोड में ऑडियो फ़ोकस के बंद होने की सूचना मिलती है, तो वीडियो चलाना रोकें या बंद करें.
जब आपका ऐप्लिकेशन PiP मोड में जाने वाला हो, तो ध्यान दें कि सिर्फ़ सबसे ऊपर वाली ऐक्टिविटी, पिक्चर-इन-पिक्चर मोड में जाती है. कुछ स्थितियों में, जैसे कि मल्टी-विंडो वाले डिवाइसों पर, ऐसा हो सकता है कि PiP मोड में चल रही गतिविधि के साथ-साथ, बैकग्राउंड में चल रही गतिविधि भी दिखने लगे. आपको इस मामले को उसी के हिसाब से हैंडल करना चाहिए. इसमें, onResume() या onPause() कॉलबैक पाने वाली गतिविधि भी शामिल है.
ऐसा भी हो सकता है कि उपयोगकर्ता, गतिविधि से इंटरैक्ट करे.
उदाहरण के लिए, अगर आपको वीडियो सूची की गतिविधि और PiP मोड में वीडियो चलाने की गतिविधि दिखती है, तो उपयोगकर्ता सूची से कोई नया वीडियो चुन सकता है. इसके बाद, PiP मोड में वीडियो चलाने की गतिविधि को अपडेट होना चाहिए.
अतिरिक्त सैंपल कोड
Kotlin में लिखा गया सैंपल ऐप्लिकेशन डाउनलोड करने के लिए, Android PictureInPicture Sample (Kotlin) देखें.