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

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

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

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

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

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

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

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

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

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

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

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

आपका ऐप्लिकेशन यह कंट्रोल करता है कि मौजूदा गतिविधि, 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 का इस्तेमाल करता है, ताकि पीआईपी मोड में जाने और उससे बाहर निकलने के दौरान, ऐनिमेशन ज़्यादा बेहतर तरीके से लागू हो.

पीआईपी मोड में जाने और उससे बाहर निकलने के लिए, 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() कॉलबैक का इस्तेमाल करते हैं. पीआईपी में एंट्री या एग्ज़िट ऐनिमेशन पूरा होने पर, यह कॉलबैक ट्रिगर होता है. 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() तरीके को कॉल करता है. अगर पीआईपी मोड पर स्विच करते समय गतिविधि रोक दी जाती है, तो वीडियो चलाना नहीं रुकना चाहिए.

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 PictureInपिक्चर सैंपल (Kotlin) देखें.