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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

अपनी गतिविधि को पीआईपी पर स्विच करें

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

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

KotlinJava
override fun onActionClicked(action: Action) {
    if (action.id.toInt() == R.id.lb_control_picture_in_picture) {
        activity?.enterPictureInPictureMode()
        return
    }
}
@Override
public void onActionClicked(Action action) {
    if (action.getId() == R.id.lb_control_picture_in_picture) {
        getActivity().enterPictureInPictureMode();
        return;
    }
    ...
}

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

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

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

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

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

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

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

बेहतर ट्रांज़िशन अनुभव पाने के लिए, रेफ़रंस के तौर पर Android Kotlin PictureInपिक्चर सैंपल देखें.

जेस्चर नेविगेशन की मदद से, पीआईपी मोड में आसानी से ट्रांज़िशन करना

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

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

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

    KotlinJava
    setPictureInPictureParams(PictureInPictureParams.Builder()
        .setAspectRatio(aspectRatio)
        .setSourceRectHint(sourceRectHint)
        .setAutoEnterEnabled(true)
        .build())
    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 बनाएं. हमारा सुझाव है कि आप वीडियो प्लेयर में, लेआउट बदलने वाले लिसनर को भी अटैच करें:

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

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

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

KotlinJava
setPictureInPictureParams(PictureInPictureParams.Builder()
    .setSeamlessResizeEnabled(false)
    .build())
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() कॉलबैक का इस्तेमाल करें, जैसा कि इन उदाहरणों में दिखाया गया है:

KotlinJava
override fun onPictureInPictureUiStateChanged(pipState: PictureInPictureUiState) {
        if (pipState.isTransitioningToPip()) {
          // Hide UI elements.
        }
    }
@Override
public void onPictureInPictureUiStateChanged(PictureInPictureUiState pipState) {
        if (pipState.isTransitioningToPip()) {
          // Hide UI elements.
        }
    }
KotlinJava
override fun onPictureInPictureModeChanged(isInPictureInPictureMode: Boolean) {
        if (isInPictureInPictureMode) {
          // Unhide UI elements.
        }
    }
@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() और प्लेबैक को सही तरीके से मैनेज करें. उदाहरण के लिए:

KotlinJava
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.
    }
}
@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) को कॉल करके पक्का करें कि यह सुविधा उपलब्ध है या नहीं.

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

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

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

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

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

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