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

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

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

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

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

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

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

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

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

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

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

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

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

  • जब कोई उपयोगकर्ता होम बटन पर टैप करता है या होम स्क्रीन पर स्वाइप करता है, तो कोई गतिविधि पिन की गई इमेज के तौर पर दिख सकती है. इस तरह, Google Maps उपयोगकर्ता के किसी दूसरी गतिविधि के दौरान भी निर्देश दिखाता रहता है.

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

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

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

पीआईपी मोड के काम करने की जानकारी देना

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

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

गतिविधि को पिन किए गए विंडो मोड पर स्विच करना

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

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

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;
    }
    ...
}

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

Kotlin

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

Java

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

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

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. अप-टू-डेट PictureInPictureParams की मदद से, setPictureInPictureParams को जल्दी कॉल करें. ऐप्लिकेशन, onUserLeaveHint कॉलबैक के लिए इंतज़ार नहीं करता (जैसा कि Android 11 में होता था).

    उदाहरण के लिए, हो सकता है कि आप आसपेक्ट रेशियो बदलने पर, सबसे पहले वीडियो चलाने पर और उसके बाद के किसी भी वीडियो चलाने पर setPictureInPictureParams को कॉल करना चाहें.

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

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

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

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

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

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

    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(false)
    .build())

Java

setPictureInPictureParams(new PictureInPictureParams.Builder()
    .setSeamlessResizeEnabled(false)
    .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.
        }
    }

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

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

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

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

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

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

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

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

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

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

अगर आपने 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() तरीके को कॉल करता है.

पिन किए गए वीडियो के लिए, प्लेबैक की एक ही गतिविधि का इस्तेमाल करना

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

वीडियो चलाने के अनुरोधों के लिए, एक ही गतिविधि का इस्तेमाल किया जाए और ज़रूरत के हिसाब से, पीआईपी मोड में स्विच किया जा सके, यह पक्का करने के लिए अपने मेनिफ़ेस्ट में गतिविधि के android:launchMode को singleTask पर सेट करें:

<activity android:name="VideoActivity"
    ...
    android:supportsPictureInPicture="true"
    android:launchMode="singleTask"
    ...

अपनी गतिविधि में, onNewIntent() को बदलें और नए वीडियो को मैनेज करें. ज़रूरत पड़ने पर, किसी भी मौजूदा वीडियो के प्लेबैक को रोकें.

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

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

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

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

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

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

अन्य सैंपल कोड

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