Android 8.0 (एपीआई लेवल 26) से, Android पर गतिविधियों को पिक्चर में पिक्चर (पीआईपी) मोड में लॉन्च किया जा सकता है. पीआईपी, मल्टी-विंडो मोड का एक खास टाइप है. इसका इस्तेमाल वीडियो चलाने, वीडियो कॉल करने, और नेविगेशन के लिए किया जाता है. इसकी मदद से, उपयोगकर्ता ऐप्लिकेशन के बीच स्विच करते समय या मुख्य स्क्रीन पर कॉन्टेंट ब्राउज़ करते समय, मौजूदा गतिविधि विंडो को स्क्रीन के किसी कोने में पिन कर सकता है.
पीआईपी, Android 7.0 में उपलब्ध मल्टी-विंडो एपीआई का इस्तेमाल करता है, ताकि पिन की गई वीडियो ओवरले विंडो उपलब्ध कराई जा सके. अपने ऐप्लिकेशन में पीआईपी मोड जोड़ने के लिए, आपको पीआईपी मोड के साथ काम करने वाली अपनी गतिविधियों को रजिस्टर करना होगा. साथ ही, ज़रूरत के हिसाब से अपनी गतिविधि को पीआईपी मोड पर स्विच करना होगा. इसके अलावा, यह पक्का करना होगा कि गतिविधि के पीआईपी मोड में होने पर, यूज़र इंटरफ़ेस (यूआई) एलिमेंट छिपे हों और वीडियो चलता रहे.
पीआईपी विंडो, स्क्रीन की सबसे ऊपरी लेयर में दिखती है. यह सिस्टम के चुने गए कोने में दिखती है.
पीआईपी की सुविधा, Android 14 (एपीआई लेवल 34) या इसके बाद के वर्शन पर काम करने वाले Android TV OS डिवाइसों पर भी काम करती है. हालांकि, दोनों में कई समानताएं हैं, लेकिन टीवी पर पीआईपी का इस्तेमाल करते समय कुछ और बातों का ध्यान रखना ज़रूरी है.
उपयोगकर्ता, पीआईपी विंडो के साथ कैसे इंटरैक्ट कर सकते हैं
उपयोगकर्ता, पीआईपी विंडो को खींचकर किसी दूसरी जगह पर ले जा सकते हैं. Android 12 और इसके बाद के वर्शन में, उपयोगकर्ता ये काम भी कर सकते हैं:
विंडो पर एक बार टैप करने से, फ़ुल-स्क्रीन टॉगल, बंद करने का बटन, सेटिंग बटन, और आपके ऐप्लिकेशन से मिलने वाली कस्टम कार्रवाइयां (उदाहरण के लिए, वीडियो चलाने के कंट्रोल) दिखती हैं.
विंडो पर दो बार टैप करके, पीआईपी के मौजूदा साइज़ और इसके सबसे बड़े या सबसे छोटे साइज़ के बीच टॉगल करें. उदाहरण के लिए, बड़ी की गई विंडो पर दो बार टैप करने से वह छोटी हो जाती है. इसी तरह, छोटी की गई विंडो पर दो बार टैप करने से वह बड़ी हो जाती है.
विंडो को बाईं या दाईं ओर खींचकर छोड़ें. छिपाई गई विंडो को वापस लाने के लिए, उसके दिखने वाले हिस्से पर टैप करें या उसे खींचकर बाहर लाएं.
पिंच-टू-ज़ूम का इस्तेमाल करके, पीआईपी विंडो का साइज़ बदलें.
आपका ऐप्लिकेशन यह कंट्रोल करता है कि मौजूदा गतिविधि, पीआईपी मोड में कब शुरू होगी. यहां कुछ उदाहरण दिए गए हैं:
जब उपयोगकर्ता होम बटन पर टैप करता है या होम स्क्रीन पर जाने के लिए ऊपर की ओर स्वाइप करता है, तो कोई गतिविधि पीआईपी मोड में जा सकती है. इस तरह, Google Maps पर दिशा-निर्देश दिखते रहते हैं, भले ही उपयोगकर्ता उसी समय कोई दूसरी गतिविधि कर रहा हो.
जब उपयोगकर्ता वीडियो से वापस जाकर अन्य कॉन्टेंट ब्राउज़ करता है, तो आपका ऐप्लिकेशन वीडियो को पीआईपी मोड में ले जा सकता है.
जब कोई उपयोगकर्ता किसी एपिसोड का आखिरी हिस्सा देख रहा हो, तब आपका ऐप्लिकेशन वीडियो को पीआईपी मोड में स्विच कर सकता है. मुख्य स्क्रीन पर, सीरीज़ के अगले एपिसोड के बारे में प्रमोशन या खास जानकारी दिखती है.
आपका ऐप्लिकेशन, उपयोगकर्ताओं को वीडियो देखने के दौरान, अन्य कॉन्टेंट को सूची में जोड़ने का विकल्प दे सकता है. वीडियो, पीआईपी मोड में चलता रहता है. वहीं, मुख्य स्क्रीन पर कॉन्टेंट चुनने की गतिविधि दिखती है.
पीआईपी की सुविधा के बारे में बताना
डिफ़ॉल्ट रूप से, सिस्टम ऐप्लिकेशन के लिए पीआईपी की सुविधा अपने-आप चालू नहीं करता. अगर आपको अपने ऐप्लिकेशन में पीआईपी मोड की सुविधा देनी है, तो android:supportsPictureInPicture को true पर सेट करके, अपने मेनिफ़ेस्ट में वीडियो गतिविधि को रजिस्टर करें. साथ ही, यह भी बताएं कि आपकी गतिविधि, लेआउट कॉन्फ़िगरेशन में होने वाले बदलावों को मैनेज करती है. इससे पीआईपी मोड में ट्रांज़िशन के दौरान लेआउट में बदलाव होने पर, आपकी गतिविधि फिर से लॉन्च नहीं होती.
<activity android:name="VideoActivity"
android:supportsPictureInPicture="true"
android:configChanges=
"screenSize|smallestScreenSize|screenLayout|orientation"
...
Jetpack की मदद से पीआईपी सुविधा लागू करना
Jetpack Picture-in-Picture लाइब्रेरी का इस्तेमाल करके, पिक्चर में पिक्चर की सुविधा लागू करें. इससे इंटिग्रेशन को आसान बनाने और ऐप्लिकेशन में होने वाली सामान्य समस्याओं को कम करने में मदद मिलती है. इसके इस्तेमाल का उदाहरण देखने के लिए, हमारे प्लैटफ़ॉर्म के सैंपल ऐप्लिकेशन पर जाएं. हालांकि, अगर आपको प्लैटफ़ॉर्म एपीआई का इस्तेमाल करके पीआईपी मोड लागू करना है, तो यह दस्तावेज़ पढ़ें.
अपनी गतिविधि को पीआईपी मोड पर स्विच करना
Android 12 और इसके बाद के वर्शन में, अपनी गतिविधि को पीआईपी मोड पर स्विच किया जा सकता है. इसके लिए, setAutoEnterEnabled फ़्लैग को true पर सेट करें. इस सेटिंग की मदद से, ज़रूरत पड़ने पर कोई गतिविधि अपने-आप पीआईपी मोड पर स्विच हो जाती है. इसके लिए, onUserLeaveHint में enterPictureInPictureMode() को साफ़ तौर पर कॉल करने की ज़रूरत नहीं होती. इसका एक और फ़ायदा यह है कि
इससे ट्रांज़िशन ज़्यादा स्मूद हो जाते हैं. ज़्यादा जानकारी के लिए, जेस्चर वाले नेविगेशन से पीआईपी मोड में आसानी से ट्रांज़िशन करना लेख पढ़ें.
अगर Android 11 या इससे पहले के वर्शन को टारगेट किया जा रहा है, तो पीआईपी मोड पर स्विच करने के लिए, किसी गतिविधि को enterPictureInPictureMode() को कॉल करना होगा. उदाहरण के लिए, जब उपयोगकर्ता ऐप्लिकेशन के यूज़र इंटरफ़ेस (यूआई) में मौजूद किसी बटन पर क्लिक करता है, तो यहां दिया गया कोड किसी गतिविधि को पीआईपी मोड पर स्विच कर देता है:
override fun onActionClicked(action: Action) {
if (action.id.toInt() == R.id.lb_control_picture_in_picture) {
activity?.enterPictureInPictureMode()
return
}
}
ऐसा हो सकता है कि आप किसी गतिविधि को बैकग्राउंड में भेजने के बजाय, उसे पीआईपी मोड में स्विच करने का लॉजिक शामिल करना चाहें. उदाहरण के लिए, अगर ऐप्लिकेशन के नेविगेट करने के दौरान उपयोगकर्ता होम या हाल ही में इस्तेमाल किए गए ऐप्लिकेशन का बटन दबाता है, तो Google Maps, पीआईपी मोड पर स्विच हो जाता है. onUserLeaveHint() को ओवरराइड करके, इस मामले को पकड़ा जा सकता है:
override fun onUserLeaveHint() {
if (iWantToBeInPipModeNow()) {
enterPictureInPictureMode()
}
}
सुझाव: उपयोगकर्ताओं को पीआईपी ट्रांज़िशन का बेहतर अनुभव दें
Android 12 में, फ़ुलस्क्रीन और पीआईपी विंडो के बीच ऐनिमेशन वाले ट्रांज़िशन में काफ़ी सुधार किए गए हैं. हमारा सुझाव है कि आप लागू होने वाले सभी बदलाव करें. ऐसा करने पर, ये बदलाव फ़ोल्ड किए जा सकने वाले डिवाइसों और टैबलेट जैसी बड़ी स्क्रीन पर अपने-आप लागू हो जाएंगे. इसके लिए, आपको कुछ और करने की ज़रूरत नहीं पड़ेगी.
अगर आपके ऐप्लिकेशन में ज़रूरी अपडेट शामिल नहीं हैं, तो भी पीआईपी ट्रांज़िशन काम करते हैं. हालांकि, ऐनिमेशन उतने बेहतर नहीं होते. उदाहरण के लिए, फ़ुलस्क्रीन से पीआईपी मोड पर स्विच करने पर, ट्रांज़िशन के दौरान पीआईपी विंडो गायब हो सकती है. हालांकि, ट्रांज़िशन पूरा होने पर यह फिर से दिखने लगती है.
इन बदलावों में ये शामिल हैं.
- जेस्चर वाले नेविगेशन से पीआईपी मोड में ट्रांज़िशन को आसान बनाना
- पीआईपी मोड में जाने और उससे बाहर निकलने के लिए, सही
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)को कॉल करें, लेकिन सिर्फ़ तब, जब ज़रूरी हो. उदाहरण के लिए, अगर मौजूदा वीडियो रुका हुआ है, तो शायद आपको पीआईपी मोड में न जाना हो.
पीआईपी मोड में जाने और उससे बाहर निकलने के लिए, सही sourceRectHint सेट करें
Android 8.0 में पीआईपी की सुविधा शुरू होने के बाद, setSourceRectHint ने गतिविधि के उस हिस्से को दिखाया जो पिक्चर में पिक्चर मोड में ट्रांज़िशन के बाद दिखता है. उदाहरण के लिए, वीडियो प्लेयर में वीडियो व्यू की सीमाएं.
Android 12 में, सिस्टम sourceRectHint का इस्तेमाल करता है, ताकि पीआईपी मोड में जाने और उससे बाहर निकलने पर, ऐनिमेशन ज़्यादा बेहतर तरीके से काम करे.
पीआईपी मोड में जाने और उससे बाहर निकलने के लिए, sourceRectHint को सही तरीके से सेट करने के लिए:
sourceRectHintको सही बाउंड के तौर पर इस्तेमाल करके,PictureInPictureParamsबनाएं. हमारा सुझाव है कि वीडियो प्लेयर में लेआउट बदलने वाला लिसनर भी अटैच करें:
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को अपडेट करें. जब सिस्टम, पीआईपी मोड से बाहर निकलने वाला होता है, तो गतिविधि की व्यू हैरारकी (व्यू और व्यू ग्रुप के लेआउट का क्रम) को उसके डेस्टिनेशन कॉन्फ़िगरेशन (उदाहरण के लिए, फ़ुल स्क्रीन) के हिसाब से सेट किया जाता है. ऐप्लिकेशन, अपने रूट व्यू या टारगेट व्यू (जैसे कि वीडियो प्लेयर व्यू) में लेआउट बदलने वाला लिसनर अटैच कर सकता है. इससे इवेंट का पता लगाया जा सकता है और ऐनिमेशन शुरू होने से पहले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 फ़्लैग जोड़ा गया है. इससे पीआईपी विंडो में वीडियो वाले कॉन्टेंट के अलावा अन्य कॉन्टेंट का साइज़ बदलने पर, क्रॉस-फ़ेडिंग ऐनिमेशन ज़्यादा बेहतर तरीके से काम करता है. पहले, पीआईपी विंडो में वीडियो के अलावा अन्य कॉन्टेंट का साइज़ बदलने पर, विज़ुअल आर्टफ़ैक्ट खराब हो सकते थे.
वीडियो कॉन्टेंट का साइज़ आसानी से बदलने की सुविधा चालू करने के लिए:
setPictureInPictureParams(PictureInPictureParams.Builder()
.setSeamlessResizeEnabled(true)
.build())
पीआईपी के दौरान यूज़र इंटरफ़ेस (यूआई) को मैनेज करना
जब गतिविधि, पिक्चर में पिक्चर (पीआईपी) मोड में शुरू या बंद होती है, तो सिस्टम Activity.onPictureInPictureModeChanged() या Fragment.onPictureInPictureModeChanged() को कॉल करता है.
Android 15 में कुछ बदलाव किए गए हैं. इनसे पीआईपी मोड में स्विच करने पर, ट्रांज़िशन और भी आसान हो जाता है. यह उन ऐप्लिकेशन के लिए फ़ायदेमंद है जिनके मुख्य यूज़र इंटरफ़ेस (यूआई) के ऊपर यूज़र इंटरफ़ेस (यूआई) एलिमेंट ओवरले होते हैं. ये एलिमेंट, पीआईपी मोड में चले जाते हैं.
डेवलपर, onPictureInPictureModeChanged() कॉलबैक का इस्तेमाल करके, ओवरले किए गए यूज़र इंटरफ़ेस (यूआई) एलिमेंट की विज़िबिलिटी को टॉगल करने वाला लॉजिक तय करते हैं. यह कॉलबैक तब ट्रिगर होता है, जब पीआईपी मोड में जाने या उससे बाहर निकलने का ऐनिमेशन पूरा हो जाता है. Android 15 से, PictureInPictureUiState क्लास में एक नई स्थिति शामिल है.
यूज़र इंटरफ़ेस (यूआई) की इस नई स्थिति के साथ, Android 15 को टारगेट करने वाले ऐप्लिकेशन, पीआईपी ऐनिमेशन शुरू होते ही isTransitioningToPip() के साथ Activity#onPictureInPictureUiStateChanged() कॉलबैक को ट्रिगर होते हुए देखते हैं. ऐसे कई यूज़र इंटरफ़ेस (यूआई) एलिमेंट हैं जो पीआईपी मोड में होने पर, ऐप्लिकेशन के लिए काम के नहीं होते. उदाहरण के लिए, ऐसे व्यू या लेआउट जिनमें सुझाव, आने वाले वीडियो, रेटिंग, और टाइटल जैसी जानकारी शामिल होती है. जब ऐप्लिकेशन पीआईपी मोड में जाता है, तो इन यूज़र इंटरफ़ेस (यूआई) एलिमेंट को छिपाने के लिए, 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.
}
}
पीआईपी विंडो के लिए, काम के न होने वाले यूज़र इंटरफ़ेस (यूआई) एलिमेंट को तुरंत छिपाने की सुविधा से, पीआईपी विंडो में जाने वाले ऐनिमेशन को बेहतर और बिना झिलमिलाहट वाला बनाया जा सकता है.
गतिविधि के यूज़र इंटरफ़ेस (यूआई) एलिमेंट को फिर से ड्रॉ करने के लिए, इन कॉलबैक को बदलें. ध्यान रखें कि पीआईपी मोड में, आपकी गतिविधि एक छोटी विंडो में दिखती है. जब ऐप्लिकेशन पीआईपी मोड में होता है, तब उपयोगकर्ता आपके ऐप्लिकेशन के यूज़र इंटरफ़ेस (यूआई) एलिमेंट के साथ इंटरैक्ट नहीं कर सकते. साथ ही, छोटे यूआई एलिमेंट की जानकारी देखना मुश्किल हो सकता है. वीडियो प्लेबैक ऐक्टिविटी में कम से कम यूज़र इंटरफ़ेस (यूआई) का इस्तेमाल करने से, उपयोगकर्ताओं को बेहतर अनुभव मिलता है.
अगर आपके ऐप्लिकेशन को पीआईपी के लिए कस्टम कार्रवाइयां उपलब्ध करानी हैं, तो इस पेज पर कंट्रोल जोड़ें देखें. गतिविधि के पीआईपी मोड में जाने से पहले, अन्य यूज़र इंटरफ़ेस (यूआई) एलिमेंट हटाएं. साथ ही, गतिविधि के फिर से फ़ुल स्क्रीन मोड में जाने पर, उन्हें वापस लाएं.
कंट्रोल बटन जोड़ें
जब उपयोगकर्ता विंडो का मेन्यू खोलता है, तो पीआईपी विंडो में कंट्रोल दिख सकते हैं. इसके लिए, मोबाइल डिवाइस पर विंडो पर टैप करें या टीवी के रिमोट से मेन्यू चुनें.
अगर किसी ऐप्लिकेशन में मीडिया सेशन चालू है, तो मीडिया चलाने, रोकने, अगले, और पिछले मीडिया पर जाने के कंट्रोल दिखेंगे.
पीआईपी मोड में जाने से पहले, PictureInPictureParams.Builder.setActions() के साथ PictureInPictureParams बनाकर, कस्टम ऐक्शन के बारे में साफ़ तौर पर बताया जा सकता है. साथ ही, enterPictureInPictureMode(android.app.PictureInPictureParams) या setPictureInPictureParams(android.app.PictureInPictureParams) का इस्तेमाल करके, पीआईपी मोड में जाने पर पैरामीटर पास किए जा सकते हैं. सावधान रहें. अगर आपने getMaxNumPictureInPictureActions() से ज़्यादा जोड़ने की कोशिश की,
तो आपको सिर्फ़ ज़्यादा से ज़्यादा संख्या मिलेगी.
पीआईपी मोड में वीडियो चलाना जारी रखना
जब आपकी गतिविधि पीआईपी मोड पर स्विच होती है, तो सिस्टम गतिविधि को रोके गए मोड में डाल देता है और गतिविधि के onPause() तरीके को कॉल करता है. अगर पीआईपी मोड में ट्रांज़िशन के दौरान गतिविधि को रोका जाता है, तो वीडियो प्लेबैक को रोकना नहीं चाहिए. इसके बजाय, उसे चलाना जारी रखना चाहिए.
Android 7.0 (एपीआई लेवल 24) और इसके बाद के वर्शन में, जब सिस्टम आपकी गतिविधि के onStop() और onStart() को कॉल करता है, तब आपको वीडियो प्लेबैक को रोकना और फिर से शुरू करना चाहिए. ऐसा करने पर, आपको यह देखने की ज़रूरत नहीं पड़ेगी कि आपका ऐप्लिकेशन onPause() में पीआईपी मोड में है या नहीं. साथ ही, आपको वीडियो को साफ़ तौर पर चलाने की ज़रूरत नहीं पड़ेगी.
अगर आपने setAutoEnterEnabled फ़्लैग को true पर सेट नहीं किया है और आपको onPause() लागू करने के दौरान प्लेबैक को रोकना है, तो isInPictureInPictureMode() को कॉल करके पीआईपी मोड देखें और प्लेबैक को सही तरीके से मैनेज करें. उदाहरण के लिए:
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() तरीके को कॉल करता है.
पीआईपी के लिए, एक ही प्लेबैक गतिविधि का इस्तेमाल करना
आपके ऐप्लिकेशन में, ऐसा हो सकता है कि कोई उपयोगकर्ता मुख्य स्क्रीन पर कॉन्टेंट ब्राउज़ करते समय कोई नया वीडियो चुने. ऐसा तब हो सकता है, जब वीडियो चलाने की गतिविधि पीआईपी मोड में हो. नए वीडियो को फ़ुल स्क्रीन मोड में, मौजूदा प्लेबैक ऐक्टिविटी में चलाएं. इसके बजाय, कोई नई ऐक्टिविटी लॉन्च न करें, क्योंकि इससे उपयोगकर्ता को भ्रम हो सकता है.
यह पक्का करने के लिए कि वीडियो प्लेबैक के अनुरोधों के लिए एक ही गतिविधि का इस्तेमाल किया जाए और ज़रूरत के हिसाब से पीआईपी मोड में स्विच किया जाए या उससे बाहर निकला जाए, अपनी मेनिफ़ेस्ट फ़ाइल में गतिविधि के android:launchMode को singleTask पर सेट करें:
<activity android:name="VideoActivity"
...
android:supportsPictureInPicture="true"
android:launchMode="singleTask"
...
अपनी गतिविधि में, onNewIntent() को बदलें और नए वीडियो को हैंडल करें. अगर ज़रूरी हो, तो मौजूदा वीडियो को रोकें.
कैमरा ऐप्लिकेशन के लिए पीआईपी मोड की सुविधा
कैमरा ऐप्लिकेशन के लिए पीआईपी मोड चालू करने के लिए, आपको यह पक्का करना होगा कि पीआईपी मोड में कैमरा चालू रहे. इसके लिए, 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)
ज़्यादा जानकारी
कम रैम वाले डिवाइसों पर, पीआईपी की सुविधा बंद हो सकती है. अपने ऐप्लिकेशन में पीआईपी मोड का इस्तेमाल करने से पहले, यह पक्का करें कि यह सुविधा उपलब्ध हो. इसके लिए, hasSystemFeature(PackageManager.FEATURE_PICTURE_IN_PICTURE) को कॉल करें.
पीआईपी मोड का इस्तेमाल, फ़ुल-स्क्रीन वीडियो चलाने वाली गतिविधियों के लिए किया जाता है. अपनी गतिविधि को पीआईपी मोड में स्विच करते समय, वीडियो कॉन्टेंट के अलावा कुछ और न दिखाएं. ट्रैक करें कि आपकी गतिविधि कब पीआईपी मोड में जाती है. साथ ही, यूज़र इंटरफ़ेस (यूआई) एलिमेंट छिपाएं. इसके बारे में पीआईपी के दौरान यूज़र इंटरफ़ेस (यूआई) को मैनेज करना में बताया गया है.
जब कोई गतिविधि पीआईपी मोड में होती है, तो डिफ़ॉल्ट रूप से उसे इनपुट फ़ोकस नहीं मिलता. पीआईपी मोड में इनपुट इवेंट पाने के लिए, MediaSession.setCallback() का इस्तेमाल करें.
setCallback() का इस्तेमाल करने के बारे में ज़्यादा जानने के लिए, 'अभी चल रहा है' कार्ड दिखाएं लेख पढ़ें.
जब आपका ऐप्लिकेशन पीआईपी मोड में होता है, तो पीआईपी विंडो में वीडियो चलाने से, किसी दूसरे ऐप्लिकेशन के ऑडियो में रुकावट आ सकती है. जैसे, म्यूज़िक प्लेयर ऐप्लिकेशन या वॉइस सर्च ऐप्लिकेशन. इससे बचने के लिए, वीडियो चलाना शुरू करते समय ऑडियो फ़ोकस का अनुरोध करें. साथ ही, ऑडियो फ़ोकस में बदलाव की सूचनाओं को मैनेज करें. इसके बारे में ऑडियो फ़ोकस मैनेज करना में बताया गया है. अगर आपको पीआईपी मोड में ऑडियो फ़ोकस न होने की सूचना मिलती है, तो वीडियो चलाना रोकें या बंद करें.
जब आपका ऐप्लिकेशन पीआईपी मोड में जाने वाला हो, तो ध्यान दें कि सिर्फ़ सबसे ऊपर मौजूद गतिविधि ही पीआईपी मोड में जाती है. कुछ मामलों में, जैसे कि मल्टी-विंडो डिवाइसों पर, ऐसा हो सकता है कि बैकग्राउंड में चल रही गतिविधि अब दिखे और पीआईपी गतिविधि के साथ फिर से दिखने लगे. आपको इस मामले को उसी हिसाब से हैंडल करना चाहिए. इसमें, onResume() या onPause() कॉलबैक पाने वाली गतिविधि भी शामिल है.
यह भी हो सकता है कि उपयोगकर्ता, गतिविधि के साथ इंटरैक्ट करे.
उदाहरण के लिए, अगर आपके पास वीडियो की सूची वाली गतिविधि है और पीआईपी मोड में वीडियो चलाने की गतिविधि है, तो उपयोगकर्ता सूची से कोई नया वीडियो चुन सकता है. इसके बाद, पीआईपी गतिविधि को उसी हिसाब से अपडेट किया जाना चाहिए.
कुछ और सैंपल कोड
Kotlin में लिखे गए सैंपल के तौर पर मिले ऐप्लिकेशन को डाउनलोड करने के लिए, Android PictureInPicture Sample (Kotlin) देखें.