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

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

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

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

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

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

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

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 के उन इलाकों की जानकारी दी जा सकती है जिन्हें ओवरले नहीं किया जाना चाहिए. Flutter, Jetpack Compose, और वेबव्यू जैसे यूज़र इंटरफ़ेस (यूआई), नेटिव तौर पर View का इस्तेमाल नहीं करते. इनमें ऐसे सब-सेक्शन हो सकते हैं जिनमें क्षेत्रों को खाली रखना ज़रूरी है. ऐसे मामलों में इस एपीआई का इस्तेमाल किया जा सकता है.

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

आपके ऐप्लिकेशन में 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" />