टीवी पर मल्टीटास्किंग

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

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

ध्यान दें कि मल्टीटास्किंग की सुविधा इंटिग्रेट करते समय, आपके ऐप्लिकेशन को टीवी ऐप्लिकेशन की क्वालिटी के दिशा-निर्देशों के मुताबिक, इस्तेमाल के टाइप की जानकारी देनी होगी.

अपने ऐप्लिकेशन को पीआईपी मोड में चलाना

Android 14 (एपीआई लेवल 34) या इसके बाद के वर्शन पर चलने वाले टीवी डिवाइसों के लिए, enterPictureInPictureMode() को कॉल करके, अपने ऐप्लिकेशन को पीआईपी मोड में चलाएं. Android के पुराने वर्शन पर चलने वाले टीवी डिवाइसों पर, पीआईपी मोड काम नहीं करता.

यहां पीआईपी मोड में जाने के लिए, बटन की लॉजिक को लागू करने का तरीका बताया गया है:

Kotlin

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    pictureInPictureButton.visibility =
        if (requireActivity().packageManager.hasSystemFeature(FEATURE_PICTURE_IN_PICTURE)) {
            pictureInPictureButton.setOnClickListener {
                val aspectRatio = Rational(view.width, view.height)
                val params = PictureInPictureParams.Builder()
                    .setAspectRatio(aspectRatio)
                    .build()
                val result = requireActivity().enterPictureInPictureMode(params)
            }
            View.VISIBLE
        } else {
            View.GONE
        }
}

Java

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    if (requireActivity().getPackageManager().hasSystemFeature(FEATURE_PICTURE_IN_PICTURE)) {
        pictureInPictureButton.setVisibility(View.VISIBLE);
        pictureInPictureButton.setOnClickListener(v -> {
            Rational aspectRatio = new Rational(view.getWidth(), view.getHeight());
            PictureInPictureParams params = new PictureInPictureParams.Builder()
                    .setAspectRatio(aspectRatio)
                    .setTitle("My Streaming App")
                    .setSubtitle("My On-Demand Content")
                    .build();
            Boolean result = requireActivity().enterPictureInPictureMode(params);
        });
    } else {
        pictureInPictureButton.setVisibility(View.GONE);
    }
}

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

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

पीआईपी मोड में चलने वाले ऐप्लिकेशन के साथ काम करना

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

Keep-clear API

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

Keep-Clear

यह बताने के लिए कि किसी व्यू को ओवरले नहीं किया जाना चाहिए, अपने एक्सएमएल लेआउट में preferKeepClear का इस्तेमाल करें. जैसे, यहां दिए गए उदाहरण में:

<TextView
    android:id="@+id/important_text"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:preferKeepClear="true"
    android:text="@string/app_name"/>

setPreferKeepClear() का इस्तेमाल करके, प्रोग्राम के ज़रिए भी ऐसा किया जा सकता है:

Kotlin

private lateinit var binding: MyLayoutBinding

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    binding = MyLayoutBinding.inflate(layoutInflater)
    setContentView(binding.root)
    binding.importantText.isPreferKeepClear = true
}

Java

private MyLayoutBinding binding;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    binding = MyLayoutBinding.inflate(getLayoutInflater());
    setContentView(binding.getRoot());
    binding.importantText.setPreferKeepClear(true);
}

ऐसा हो सकता है कि आपको पूरे View को साफ़ रखने की ज़रूरत न हो, बल्कि सिर्फ़ उसके किसी सेक्शन को साफ़ रखने की ज़रूरत हो. setPreferKeepClearRects() का इस्तेमाल करके, View के उन हिस्सों की जानकारी दी जा सकती है जिन्हें ओवरले नहीं किया जाना चाहिए. ऐसे यूज़र इंटरफ़ेस (यूआई) जो मूल रूप से View का इस्तेमाल नहीं करते, जैसे कि Flutter, Jetpack Compose, और WebView में ऐसे सब-सेक्शन हो सकते हैं जिनके लिए, कुछ हिस्सों को साफ़ रखने की ज़रूरत होती है. इन मामलों के लिए, इस एपीआई का इस्तेमाल किया जा सकता है.

इस्तेमाल के टाइप

आपके ऐप्लिकेशन को मेटा-डेटा वैल्यू एट्रिब्यूट की जानकारी देनी होगी com.google.android.tv.pip.category. यह एट्रिब्यूट, 'पिक्चर में पिक्चर' मोड के लिए, इस्तेमाल के मुख्य टाइप या टाइप से जुड़ा होता है. जिस भी <activity> के लिए सेट किया गया है android:supportsPictureInPicture="true", उसे इस एट्रिब्यूट की जानकारी, नीचे दी गई टेबल में मौजूद किसी काम की वैल्यू के साथ देनी चाहिए.

इस्तेमाल के ऐसे टाइप जो इनमें से किसी भी कैटगरी में नहीं आते, उन्हें टीवी पर 'पिक्चर में पिक्चर' मोड में इस्तेमाल करने की अनुमति नहीं है. खास तौर पर, मीडिया कॉन्टेंट को चलाने के लिए, इस मोड का इस्तेमाल नहीं किया जा सकता.

मान ब्यौरा
"communication" कम्यूनिकेशन के इस्तेमाल के मामले, जैसे कि वीडियो या वॉइस कॉल.
"smartHome" स्मार्ट होम इंटिग्रेशन, जैसे कि कनेक्ट किए गए डोरबेल या बेबी मॉनिटर.
"health" सेहत से जुड़े इस्तेमाल के मामले, जैसे कि फ़िटनेस ट्रैकिंग या सेहत की निगरानी.
"ticker" टिकर के इस्तेमाल के मामले, जैसे कि लाइव स्पोर्ट्स स्कोर या खबरें और स्टॉक टिकर.

एक से ज़्यादा वैल्यू को वर्टिकल बार (|) से अलग किया जाता है. उदाहरण के लिए:

<meta-data android:name="com.google.android.tv.pip.category" android:value="smartHome|health" />