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