पिक्चर में पिक्चर (पीआईपी) की सुविधा का इस्तेमाल करके वीडियो जोड़ना

लिखने की सुविधा आज़माएं
Android के लिए, Jetpack Compose को यूज़र इंटरफ़ेस (यूआई) टूलकिट के तौर पर इस्तेमाल करने का सुझाव दिया जाता है. Compose में पिक्चर में पिक्चर मोड की सुविधा इस्तेमाल करने का तरीका जानें.

Android 8.0 (एपीआई लेवल 26) से, Android में ऐक्टिविटी को पिक्चर में पिक्चर (पीआईपी) मोड में लॉन्च करने की अनुमति है. पीआईपी, मल्टी-विंडो मोड का एक खास टाइप है. इसका इस्तेमाल ज़्यादातर वीडियो चलाने के लिए किया जाता है. इस सुविधा की मदद से, उपयोगकर्ता ऐप्लिकेशन के बीच स्विच करते समय या मुख्य स्क्रीन पर कॉन्टेंट ब्राउज़ करते समय, स्क्रीन के कोने पर पिन की गई एक छोटी विंडो में वीडियो देख सकता है.

पीआईपी, Android 7.0 में उपलब्ध मल्टी-विंडो एपीआई का इस्तेमाल करता है, ताकि पिन की गई वीडियो ओवरले विंडो उपलब्ध कराई जा सके. अपने ऐप्लिकेशन में PiP मोड जोड़ने के लिए, आपको उन गतिविधियों को रजिस्टर करना होगा जो PiP मोड के साथ काम करती हैं. साथ ही, ज़रूरत के मुताबिक अपनी गतिविधि को PiP मोड पर स्विच करना होगा. इसके अलावा, यह पक्का करना होगा कि गतिविधि के PiP मोड में होने पर, यूज़र इंटरफ़ेस (यूआई) एलिमेंट छिपे हों और वीडियो चलता रहे.

PiP विंडो, स्क्रीन की सबसे ऊपर वाली लेयर में दिखती है. यह स्क्रीन के उस कोने में दिखती है जिसे सिस्टम चुनता है.

PiP मोड की सुविधा, Android TV OS के उन डिवाइसों पर भी काम करती है जिन पर Android 14 (एपीआई लेवल 34) या इसके बाद का वर्शन चल रहा हो. इन दोनों सुविधाओं में कई समानताएं हैं. हालांकि, टीवी पर PiP मोड का इस्तेमाल करते समय, कुछ बातों का ध्यान रखना ज़रूरी है.

उपयोगकर्ता, PiP विंडो के साथ कैसे इंटरैक्ट कर सकते हैं

उपयोगकर्ता, पीआईपी विंडो को खींचकर किसी दूसरी जगह पर ले जा सकते हैं. Android 12 से, उपयोगकर्ता ये काम भी कर सकते हैं:

  • विंडो पर एक बार टैप करने से, फ़ुलस्क्रीन टॉगल, बंद करें बटन, सेटिंग बटन, और आपके ऐप्लिकेशन की ओर से उपलब्ध कराई गई कस्टम कार्रवाइयां दिखती हैं. उदाहरण के लिए, मीडिया प्लेयर के कंट्रोल.

  • विंडो पर दो बार टैप करके, मौजूदा पीआईपी साइज़ और ज़्यादा से ज़्यादा या कम से कम पीआईपी साइज़ के बीच टॉगल करें. उदाहरण के लिए, बड़ी की गई विंडो पर दो बार टैप करने से वह छोटी हो जाती है. इसी तरह, छोटी की गई विंडो पर दो बार टैप करने से वह बड़ी हो जाती है.

  • विंडो को बाएं या दाएं किनारे पर खींचकर छोड़ें. विंडो को वापस लाने के लिए, छिपाई गई विंडो के दिखने वाले हिस्से पर टैप करें या उसे खींचकर बाहर लाएं.

  • पिंच करके ज़ूम करने की सुविधा का इस्तेमाल करके, पीआईपी विंडो का साइज़ बदलें.

ऐप्लिकेशन यह कंट्रोल करता है कि मौजूदा गतिविधि को PiP मोड में कब ले जाना है. यहाँ कुछ उदाहरण दिए गए हैं:

  • जब उपयोगकर्ता होम बटन पर टैप करता है या होम स्क्रीन पर ऊपर की ओर स्वाइप करता है, तब कोई गतिविधि PiP मोड में आ सकती है. इस तरह, Google Maps एक ही समय में उपयोगकर्ता को निर्देश दिखाता रहता है, जबकि वह कोई दूसरी गतिविधि करता है.

  • जब कोई उपयोगकर्ता वीडियो से वापस जाकर अन्य कॉन्टेंट ब्राउज़ करता है, तब आपका ऐप्लिकेशन वीडियो को पीआईपी मोड में ले जा सकता है.

  • जब कोई उपयोगकर्ता कॉन्टेंट के किसी एपिसोड के आखिर में पहुंचता है, तब आपका ऐप्लिकेशन वीडियो को पीआईपी मोड में स्विच कर सकता है. मुख्य स्क्रीन पर, सीरीज़ के अगले एपिसोड के बारे में प्रमोशन या खास जानकारी दिखती है.

  • आपका ऐप्लिकेशन, उपयोगकर्ताओं को वीडियो देखते समय अन्य कॉन्टेंट को कतार में लगाने की सुविधा दे सकता है. पीआईपी मोड में वीडियो चलता रहता है. वहीं, मुख्य स्क्रीन पर कॉन्टेंट चुनने की गतिविधि दिखती है.

पीआईपी मोड की सुविधा के बारे में जानकारी देना

डिफ़ॉल्ट रूप से, सिस्टम ऐप्लिकेशन के लिए PiP मोड को अपने-आप चालू नहीं करता. अगर आपको अपने ऐप्लिकेशन में PiP मोड की सुविधा चाहिए, तो अपने मेनिफ़ेस्ट में वीडियो गतिविधि रजिस्टर करें. इसके लिए, android:supportsPictureInPicture को true पर सेट करें. यह भी बताएं कि आपकी ऐक्टिविटी, लेआउट कॉन्फ़िगरेशन में होने वाले बदलावों को मैनेज करती है. इससे, PiP मोड में ट्रांज़िशन के दौरान लेआउट में बदलाव होने पर, आपकी ऐक्टिविटी फिर से लॉन्च नहीं होगी.

<activity android:name="VideoActivity"
    android:supportsPictureInPicture="true"
    android:configChanges=
        "screenSize|smallestScreenSize|screenLayout|orientation"
    ...

अपनी गतिविधि को PiP मोड में स्विच करना

Android 12 और उसके बाद के वर्शन में, setAutoEnterEnabled फ़्लैग को true पर सेट करके, गतिविधि को पीआईपी मोड पर स्विच किया जा सकता है. इस सेटिंग की मदद से, किसी गतिविधि को ज़रूरत के हिसाब से पीआईपी मोड में अपने-आप स्विच किया जा सकता है. इसके लिए, आपको onUserLeaveHint में enterPictureInPictureMode() को अलग से कॉल करने की ज़रूरत नहीं होती. साथ ही, इससे ट्रांज़िशन को ज़्यादा आसानी से मैनेज किया जा सकता है. ज़्यादा जानकारी के लिए, हावभाव से नेविगेट करने के दौरान, PiP मोड में आसानी से ट्रांज़िशन करना लेख पढ़ें.

अगर Android 11 या इससे पहले के वर्शन को टारगेट किया जा रहा है, तो PiP मोड पर स्विच करने के लिए किसी गतिविधि को enterPictureInPictureMode() कॉल करना होगा. उदाहरण के लिए, यहां दिया गया कोड, ऐप्लिकेशन के यूज़र इंटरफ़ेस (यूआई) में मौजूद किसी बटन पर क्लिक करने पर, गतिविधि को पीआईपी मोड में स्विच करता है:

Kotlin

override fun onActionClicked(action: Action) {
    if (action.id.toInt() == R.id.lb_control_picture_in_picture) {
        activity?.enterPictureInPictureMode()
        return
    }
}

Java

@Override
public void onActionClicked(Action action) {
    if (action.getId() == R.id.lb_control_picture_in_picture) {
        getActivity().enterPictureInPictureMode();
        return;
    }
    ...
}

आपको ऐसा लॉजिक शामिल करना पड़ सकता है जो गतिविधि को बैकग्राउंड में ले जाने के बजाय, PiP मोड में स्विच कर दे. उदाहरण के लिए, अगर उपयोगकर्ता नेविगेट करते समय होम या हाल ही के बटन को दबाता है, तो Google Maps पीआईपी मोड पर स्विच हो जाता है. onUserLeaveHint() को बदलकर, इस मामले को ठीक किया जा सकता है:

Kotlin

override fun onUserLeaveHint() {
    if (iWantToBeInPipModeNow()) {
        enterPictureInPictureMode()
    }
}

Java

@Override
public void onUserLeaveHint () {
    if (iWantToBeInPipModeNow()) {
        enterPictureInPictureMode();
    }
}

सुझाया गया: उपयोगकर्ताओं को बेहतर PiP ट्रांज़िशन का अनुभव दें

Android 12 में, फ़ुलस्क्रीन और पीआईपी विंडो के बीच ऐनिमेटेड ट्रांज़िशन में काफ़ी सुधार किए गए हैं. हमारा सुझाव है कि आप सभी ज़रूरी बदलाव लागू करें. ऐसा करने के बाद, ये बदलाव अपने-आप बड़ी स्क्रीन वाले डिवाइसों, जैसे कि फ़ोल्ड किए जा सकने वाले फ़ोन और टैबलेट पर दिखने लगेंगे. इसके लिए, आपको कुछ और करने की ज़रूरत नहीं होगी.

अगर आपके ऐप्लिकेशन में ज़रूरी अपडेट शामिल नहीं हैं, तो पीआईपी ट्रांज़िशन की सुविधा अब भी काम करेगी. हालांकि, ऐनिमेशन पहले की तरह बेहतर नहीं होंगे. उदाहरण के लिए, फ़ुलस्क्रीन से पीआईपी मोड पर स्विच करने के दौरान, पीआईपी विंडो गायब हो सकती है. हालांकि, स्विच करने की प्रोसेस पूरी होने के बाद, यह फिर से दिखने लगती है.

इन बदलावों में ये शामिल हैं.

  • हाथ के जेस्चर (स्पर्श) वाले नेविगेशन से पीआईपी मोड में ट्रांज़िशन को ज़्यादा आसान बनाया गया
  • पीआईपी मोड में जाने और इससे बाहर निकलने के लिए, सही sourceRectHint सेट करना
  • वीडियो के अलावा अन्य कॉन्टेंट के लिए, साइज़ बदलने की सुविधा बंद करना

बेहतर ट्रांज़िशन अनुभव को चालू करने के लिए, Android Kotlin PictureInPicture के सैंपल को रेफ़रंस के तौर पर इस्तेमाल करें.

हाथ के जेस्चर (स्पर्श) वाले नेविगेशन से पीआईपी मोड में आसानी से स्विच करना

Android 12 से, setAutoEnterEnabled फ़्लैग की मदद से, जेस्चर नेविगेशन का इस्तेमाल करके पीआईपी मोड में वीडियो कॉन्टेंट पर स्विच करने के लिए, ज़्यादा स्मूद ऐनिमेशन मिलता है. उदाहरण के लिए, फ़ुलस्क्रीन से होम स्क्रीन पर ऊपर की ओर स्वाइप करते समय.

यह बदलाव करने के लिए, यह तरीका अपनाएं. साथ ही, रेफ़रंस के लिए इस उदाहरण को देखें:

  1. PictureInPictureParams.Builder बनाने के लिए, setAutoEnterEnabled का इस्तेमाल करें:

    Kotlin

    setPictureInPictureParams(PictureInPictureParams.Builder()
        .setAspectRatio(aspectRatio)
        .setSourceRectHint(sourceRectHint)
        .setAutoEnterEnabled(true)
        .build())

    Java

    setPictureInPictureParams(new PictureInPictureParams.Builder()
        .setAspectRatio(aspectRatio)
        .setSourceRectHint(sourceRectHint)
        .setAutoEnterEnabled(true)
        .build());
  2. setPictureInPictureParams को कॉल करके, PictureInPictureParams के बारे में अप-टू-डेट जानकारी पाएं. ऐप्लिकेशन, onUserLeaveHint कॉलबैक का इंतज़ार नहीं करता. ऐसा Android 11 में होता था.

    उदाहरण के लिए, अगर आसपेक्ट रेशियो (लंबाई-चौड़ाई का अनुपात) बदल दिया जाता है, तो हो सकता है कि आपको पहली बार वीडियो चलाने पर और उसके बाद वीडियो चलाने पर setPictureInPictureParams को कॉल करना पड़े.

  3. setAutoEnterEnabled(false) को कॉल करें, लेकिन सिर्फ़ तब, जब ऐसा करना ज़रूरी हो. उदाहरण के लिए, अगर वीडियो रुका हुआ है, तो शायद आपको पीआईपी मोड में नहीं जाना चाहिए.

PiP मोड में जाने और इससे बाहर निकलने के लिए, सही sourceRectHint सेट करें

Android 8.0 में पीआईपी मोड की सुविधा शुरू होने के बाद, setSourceRectHint से यह पता चलता था कि पीआईपी मोड में ट्रांज़िशन होने के बाद, गतिविधि का कौन-सा हिस्सा दिखेगा. उदाहरण के लिए, वीडियो प्लेयर में वीडियो व्यू बाउंड्री.

Android 12 में, सिस्टम sourceRectHint का इस्तेमाल करता है. इससे पीआईपी मोड में जाने और उससे बाहर निकलने के दौरान, ऐनिमेशन ज़्यादा स्मूद तरीके से काम करता है.

PiP मोड में जाने और उससे बाहर निकलने के लिए, sourceRectHint को सही तरीके से सेट करने का तरीका:

  1. PictureInPictureParams बनाएं. इसके लिए, sourceRectHint के तौर पर सही बाउंड का इस्तेमाल करें. हमारा सुझाव है कि वीडियो प्लेयर में लेआउट बदलने वाले लिसनर को भी अटैच करें:

    Kotlin

    val mOnLayoutChangeListener =
    OnLayoutChangeListener { v: View?, oldLeft: Int,
            oldTop: Int, oldRight: Int, oldBottom: Int, newLeft: Int, newTop:
            Int, newRight: Int, newBottom: Int ->
        val sourceRectHint = Rect()
        mYourVideoView.getGlobalVisibleRect(sourceRectHint)
        val builder = PictureInPictureParams.Builder()
            .setSourceRectHint(sourceRectHint)
        setPictureInPictureParams(builder.build())
    }
    
    mYourVideoView.addOnLayoutChangeListener(mOnLayoutChangeListener)

    Java

    private final View.OnLayoutChangeListener mOnLayoutChangeListener =
            (v, oldLeft, oldTop, oldRight, oldBottom, newLeft, newTop, newRight,
            newBottom) -> {
        final Rect sourceRectHint = new Rect();
        mYourVideoView.getGlobalVisibleRect(sourceRectHint);
        final PictureInPictureParams.Builder builder =
            new PictureInPictureParams.Builder()
                .setSourceRectHint(sourceRectHint);
        setPictureInPictureParams(builder.build());
    };
    
    mYourVideoView.addOnLayoutChangeListener(mOnLayoutChangeListener);
  2. अगर ज़रूरी हो, तो सिस्टम के एक्ज़िट ट्रांज़िशन शुरू करने से पहले, sourceRectHint को अपडेट करें. जब सिस्टम, PiP मोड से बाहर निकलने वाला होता है, तब गतिविधि की व्यू हैरारकी को उसके डेस्टिनेशन कॉन्फ़िगरेशन (उदाहरण के लिए, फ़ुल स्क्रीन) में लेआउट किया जाता है. ऐप्लिकेशन, लेआउट में बदलाव करने वाले लिसनर को अपनी रूट व्यू या टारगेट व्यू (जैसे, वीडियो प्लेयर व्यू) से अटैच कर सकता है. इससे इवेंट का पता लगाया जा सकता है. साथ ही, ऐनिमेशन शुरू होने से पहले sourceRectHint को अपडेट किया जा सकता है.

    Kotlin

    // 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()
            )
        }
    }

    Java

    // Listener is called right after the user exits PiP but before animating.
    playerView.addOnLayoutChangeListener((v, 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.
            final Rect sourceRectHint = new Rect();
            playerView.getGlobalVisibleRect(sourceRectHint);
            setPictureInPictureParams(
                new PictureInPictureParams.Builder()
                    .setSourceRectHint(sourceRectHint)
                    .build());
        }
    });

वीडियो के अलावा अन्य कॉन्टेंट के लिए, बिना किसी रुकावट के आकार बदलने की सुविधा बंद करना

Android 12 में setSeamlessResizeEnabled फ़्लैग जोड़ा गया है. इससे, PiP विंडो में वीडियो के अलावा अन्य कॉन्टेंट का साइज़ बदलते समय, क्रॉस-फ़ेडिंग ऐनिमेशन ज़्यादा स्मूद तरीके से दिखता है. इससे पहले, पीआईपी विंडो में वीडियो के अलावा अन्य कॉन्टेंट का साइज़ बदलने पर, विज़ुअल आर्टफ़ैक्ट दिख सकते थे.

वीडियो कॉन्टेंट के साइज़ को आसानी से बदलने की सुविधा चालू करने के लिए:

Kotlin

setPictureInPictureParams(PictureInPictureParams.Builder()
    .setSeamlessResizeEnabled(true)
    .build())

Java

setPictureInPictureParams(new PictureInPictureParams.Builder()
    .setSeamlessResizeEnabled(true)
    .build());

पीआईपी के दौरान यूज़र इंटरफ़ेस (यूआई) को मैनेज करना

जब गतिविधि, पिक्चर में पिक्चर (पीआईपी) मोड में जाती है या उससे बाहर निकलती है, तो सिस्टम Activity.onPictureInPictureModeChanged() या Fragment.onPictureInPictureModeChanged() को कॉल करता है.

Android 15 में ऐसे बदलाव किए गए हैं जिनसे पीआईपी मोड में जाने पर, ट्रांज़िशन और भी ज़्यादा स्मूद हो जाता है. यह उन ऐप्लिकेशन के लिए फ़ायदेमंद है जिनके यूज़र इंटरफ़ेस (यूआई) एलिमेंट, मुख्य यूज़र इंटरफ़ेस (यूआई) के ऊपर ओवरले किए जाते हैं. मुख्य यूज़र इंटरफ़ेस (यूआई), पीआईपी मोड में चला जाता है.

डेवलपर, onPictureInPictureModeChanged() कॉलबैक का इस्तेमाल करके, ऐसा लॉजिक तय करते हैं जो ओवरले किए गए यूज़र इंटरफ़ेस (यूआई) एलिमेंट की विज़िबिलिटी को टॉगल करता है. यह कॉलबैक तब ट्रिगर होता है, जब PiP मोड में जाने या उससे बाहर निकलने का ऐनिमेशन पूरा हो जाता है. Android 15 से, PictureInPictureUiState क्लास में एक नई स्थिति शामिल है.

यूज़र इंटरफ़ेस (यूआई) की इस नई स्थिति के साथ, Android 15 को टारगेट करने वाले ऐप्लिकेशन, पीआईपी ऐनिमेशन शुरू होते ही Activity#onPictureInPictureUiStateChanged() कॉलबैक को isTransitioningToPip() के साथ इनवोक करते हैं. ऐसे कई यूज़र इंटरफ़ेस (यूआई) एलिमेंट हैं जो ऐप्लिकेशन के पीआईपी मोड में होने पर काम के नहीं होते. उदाहरण के लिए, व्यू या लेआउट में सुझाव, आने वाला वीडियो, रेटिंग, और टाइटल जैसी जानकारी शामिल होती है. जब ऐप्लिकेशन पीआईपी मोड में चला जाता है, तब इन यूज़र इंटरफ़ेस (यूआई) एलिमेंट को छिपाने के लिए, onPictureInPictureUiStateChanged() कॉलबैक का इस्तेमाल करें. जब ऐप्लिकेशन, पीआईपी विंडो से फ़ुल स्क्रीन मोड में जाता है, तो इन एलिमेंट को दिखाने के लिए onPictureInPictureModeChanged() कॉलबैक का इस्तेमाल करें. यहां दिए गए उदाहरणों में दिखाया गया है:

Kotlin

override fun onPictureInPictureUiStateChanged(pipState: PictureInPictureUiState) {
        if (pipState.isTransitioningToPip()) {
          // Hide UI elements.
        }
    }

Java

@Override
public void onPictureInPictureUiStateChanged(PictureInPictureUiState pipState) {
        if (pipState.isTransitioningToPip()) {
          // Hide UI elements.
        }
    }

Kotlin

override fun onPictureInPictureModeChanged(isInPictureInPictureMode: Boolean) {
        if (isInPictureInPictureMode) {
          // Unhide UI elements.
        }
    }

Java

@Override
public void onPictureInPictureModeChanged(boolean isInPictureInPictureMode) {
        if (isInPictureInPictureMode) {
          // Unhide UI elements.
        }
    }

पीआईपी विंडो के लिए, काम के न होने वाले यूज़र इंटरफ़ेस (यूआई) एलिमेंट को तुरंत दिखाने या छिपाने की सुविधा मिलती है. इससे पीआईपी विंडो को आसानी से और बिना किसी रुकावट के ऐनिमेट किया जा सकता है.

गतिविधि के यूज़र इंटरफ़ेस (यूआई) एलिमेंट को फिर से बनाने के लिए, इन कॉलबैक को बदलें. ध्यान रखें कि PiP मोड में, आपकी गतिविधि एक छोटी विंडो में दिखती है. जब ऐप्लिकेशन PiP मोड में होता है, तब उपयोगकर्ता आपके ऐप्लिकेशन के यूज़र इंटरफ़ेस (यूआई) एलिमेंट से इंटरैक्ट नहीं कर सकते. साथ ही, छोटे यूज़र इंटरफ़ेस (यूआई) एलिमेंट की जानकारी देखना मुश्किल हो सकता है. कम से कम यूज़र इंटरफ़ेस (यूआई) वाली वीडियो चलाने की सुविधाओं से, उपयोगकर्ताओं को बेहतर अनुभव मिलता है.

अगर आपके ऐप्लिकेशन को पीआईपी के लिए कस्टम कार्रवाइयां उपलब्ध करानी हैं, तो इस पेज पर कंट्रोल जोड़ना लेख पढ़ें. गतिविधि के PiP मोड में जाने से पहले, अन्य यूज़र इंटरफ़ेस (यूआई) एलिमेंट हटाएं. गतिविधि के फिर से फ़ुल स्क्रीन मोड में आने पर, उन्हें वापस लाएं.

कंट्रोल बटन जोड़ें

जब उपयोगकर्ता विंडो का मेन्यू खोलता है, तब पीआईपी विंडो में कंट्रोल दिख सकते हैं. इसके लिए, मोबाइल डिवाइस पर विंडो पर टैप करें या टीवी रिमोट से मेन्यू चुनें.

अगर किसी ऐप्लिकेशन में मीडिया सेशन चालू है, तो आपको चलाने, रोकने, अगला, और पिछला कंट्रोल दिखेगा.

पीआईपी मोड में जाने से पहले, PictureInPictureParams का इस्तेमाल करके कस्टम कार्रवाइयां बनाई जा सकती हैं. साथ ही, पीआईपी मोड में जाते समय, PictureInPictureParams.Builder.setActions() का इस्तेमाल करके पैरामीटर पास किए जा सकते हैं. इसके अलावा, enterPictureInPictureMode(android.app.PictureInPictureParams) या setPictureInPictureParams(android.app.PictureInPictureParams) का इस्तेमाल करके भी पैरामीटर पास किए जा सकते हैं. सावधान रहें. अगर getMaxNumPictureInPictureActions() से ज़्यादा आइटम जोड़ने की कोशिश की जाती है, तो आपको सिर्फ़ तय सीमा के मुताबिक आइटम मिलेंगे.

पीआईपी मोड में वीडियो चलाते रहना

जब आपकी गतिविधि PiP मोड में स्विच होती है, तो सिस्टम गतिविधि को रोके गए मोड में डाल देता है. साथ ही, गतिविधि के onPause() तरीके को कॉल करता है. अगर PiP मोड में ट्रांज़िशन करते समय गतिविधि रुक जाती है, तो वीडियो चलना बंद नहीं होना चाहिए. इसके बजाय, वीडियो चलना जारी रहना चाहिए.

Android 7.0 और इसके बाद के वर्शन में, जब सिस्टम आपकी गतिविधि के onStop() और onStart() को कॉल करता है, तब आपको वीडियो चलाने की सुविधा को रोकना और फिर से शुरू करना चाहिए. ऐसा करने से, आपको यह देखने की ज़रूरत नहीं पड़ेगी कि आपका ऐप्लिकेशन onPause() में PiP मोड में है या नहीं. साथ ही, आपको वीडियो चलाने की अनुमति देने की ज़रूरत भी नहीं पड़ेगी.

अगर आपने setAutoEnterEnabled फ़्लैग को true पर सेट नहीं किया है और आपको onPause() लागू करने के दौरान वीडियो चलाने की सुविधा को रोकना है, तो isInPictureInPictureMode() को कॉल करके PiP मोड की जांच करें और वीडियो चलाने की सुविधा को सही तरीके से मैनेज करें. उदाहरण के लिए:

Kotlin

override fun onPause() {
    super.onPause()
    // If called while in PiP mode, do not pause playback.
    if (isInPictureInPictureMode) {
        // Continue playback.
    } else {
        // Use existing playback logic for paused activity behavior.
    }
}

Java

@Override
public void onPause() {
    // If called while in PiP mode, do not 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() को बदलें और नए वीडियो को मैनेज करें. साथ ही, अगर ज़रूरी हो, तो मौजूदा वीडियो का प्लेबैक रोकें.

सबसे सही तरीके

कम रैम वाले डिवाइसों पर, PiP की सुविधा बंद हो सकती है. आपका ऐप्लिकेशन PiP का इस्तेमाल करे, इससे पहले यह पक्का करें कि यह सुविधा उपलब्ध है. इसके लिए, hasSystemFeature(PackageManager.FEATURE_PICTURE_IN_PICTURE) को कॉल करें.

पीआईपी मोड का इस्तेमाल उन गतिविधियों के लिए किया जाता है जिनमें फ़ुल-स्क्रीन वीडियो चलाया जाता है. पीआईपी मोड में स्विच करते समय, वीडियो कॉन्टेंट के अलावा कुछ और न दिखाएं. ट्रैक करें कि आपकी गतिविधि कब PiP मोड में जाती है और यूज़र इंटरफ़ेस (यूआई) एलिमेंट को छिपाएं. इसके बारे में PiP मोड के दौरान यूज़र इंटरफ़ेस (यूआई) को मैनेज करना लेख में बताया गया है.

जब कोई गतिविधि पीआईपी मोड में होती है, तो डिफ़ॉल्ट रूप से उसे इनपुट फ़ोकस नहीं मिलता है. पीआईपी मोड में इनपुट इवेंट पाने के लिए, MediaSession.setCallback() का इस्तेमाल करें. setCallback() का इस्तेमाल करने के बारे में ज़्यादा जानने के लिए, 'अभी चल रहा है' कार्ड दिखाना लेख पढ़ें.

जब आपका ऐप्लिकेशन पीआईपी मोड में होता है, तब पीआईपी विंडो में वीडियो चलाने से, किसी दूसरे ऐप्लिकेशन के ऑडियो में रुकावट आ सकती है. जैसे, म्यूज़िक प्लेयर ऐप्लिकेशन या बोलकर खोज करने वाले ऐप्लिकेशन के ऑडियो में रुकावट आ सकती है. इससे बचने के लिए, वीडियो चलाना शुरू करते समय ऑडियो फ़ोकस का अनुरोध करें. साथ ही, ऑडियो फ़ोकस में बदलाव होने पर मिलने वाली सूचनाओं को मैनेज करें. इसके बारे में ऑडियो फ़ोकस मैनेज करना लेख में बताया गया है. अगर आपको पीआईपी मोड में ऑडियो फ़ोकस के बंद होने की सूचना मिलती है, तो वीडियो को रोकें या बंद करें.

जब आपका ऐप्लिकेशन पीआईपी मोड में जाने वाला हो, तब ध्यान दें कि सिर्फ़ सबसे ऊपर वाली ऐक्टिविटी, पिक्चर-इन-पिक्चर मोड में जाती है. कुछ स्थितियों में, जैसे कि मल्टी-विंडो वाले डिवाइसों पर, ऐसा हो सकता है कि नीचे दी गई गतिविधि अब दिखाई जाए और PiP गतिविधि के साथ फिर से दिखने लगे. आपको इस मामले को उसी हिसाब से हैंडल करना चाहिए. इसमें, नीचे दी गई गतिविधि के लिए onResume() या onPause() कॉलबैक पाना भी शामिल है. ऐसा भी हो सकता है कि उपयोगकर्ता, गतिविधि से इंटरैक्ट करे. उदाहरण के लिए, अगर वीडियो की सूची दिखाने वाली गतिविधि और PiP मोड में वीडियो चलाने वाली गतिविधि दिख रही है, तो उपयोगकर्ता सूची से कोई नया वीडियो चुन सकता है. इसके बाद, PiP गतिविधि को उसके हिसाब से अपडेट होना चाहिए.

अतिरिक्त सैंपल कोड

Kotlin में लिखा गया सैंपल ऐप्लिकेशन डाउनलोड करने के लिए, Android PictureInPicture Sample (Kotlin) पर जाएं.