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

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

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

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

अगर Android 11 या इससे पहले के वर्शन को टारगेट किया जा रहा है, तो पीआईपी मोड में स्विच करने के लिए, किसी ऐक्टिविटी को 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;
    }
    ...
}

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

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

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

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

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

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

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

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

Kotlin

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

Java

setPictureInPictureParams(new PictureInPictureParams.Builder()
    .setSeamlessResizeEnabled(true)
    .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 के साथ PictureInPictureParams.Builder.setActions() बनाकर, कस्टम ऐक्शन को साफ़ तौर पर तय किया जा सकता है. साथ ही, पीआईपी मोड में जाने पर, enterPictureInPictureMode(android.app.PictureInPictureParams) या setPictureInPictureParams(android.app.PictureInPictureParams)का इस्तेमाल करके, पैरामीटर पास किए जा सकते हैं. सावधान रहें. अगर getMaxNumPictureInPictureActions()से ज़्यादा ऐक्शन जोड़ने की कोशिश की जाती है, तो आपको सिर्फ़ ज़्यादा से ज़्यादा ऐक्शन मिलेंगे.

पीआईपी मोड में वीडियो प्लेबैक जारी रखना

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

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

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

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

कैमरा ऐप्लिकेशन के लिए पीआईपी की सुविधा चालू करना

कैमरा ऐप्लिकेशन के लिए पीआईपी की सुविधा चालू करने के लिए, आपको यह पक्का करना होगा कि कैमरा, पीआईपी मोड में चालू रहे. इसके लिए, onPause() को कॉल करने पर, कैमरा बंद न हो:

Java

@Override
public void onPause() {
    super.onPause();
    // Don't close the camera if the app is entering PiP mode
    if (!isInPictureInPictureMode()) {
        closeCamera();
    }
}

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

आसानी से ट्रांज़िशन के लिए, sourceRectHint का हिसाब लगाना

आसानी से ट्रांज़िशन के लिए, कैमरा व्यूफ़ाइंडर के सटीक स्क्रीन कोऑर्डिनेट के साथ, सटीक sourceRectHint उपलब्ध कराना ज़रूरी है. प्रीव्यू व्यू से सीमाएं पाने के लिए, getGlobalVisibleRect() का इस्तेमाल किया जा सकता है. जैसे:

Java

View previewView = findViewById(R.id.preview_view);
Rect globalRect = new Rect();
// Ensure the view is laid out before calling getGlobalVisibleRect() to get valid screen coordinates.
previewView.getGlobalVisibleRect(globalRect);
PictureInPictureParams params = new PictureInPictureParams.Builder()
    .setSourceRectHint(globalRect)
    .build();
setPictureInPictureParams(params);

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

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

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

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

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

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

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

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