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 एपीआई
कुछ मामलों में, पीआईपी ऐप्लिकेशन, फ़ुलस्क्रीन ऐप्लिकेशन में मौजूद यूज़र इंटरफ़ेस (यूआई) के ज़रूरी कॉम्पोनेंट को ओवरले कर सकता है. इस समस्या को कम करने के लिए, कीप-क्लियर एपीआई उपलब्ध हैं. ऐप्लिकेशन इनका इस्तेमाल करके, यूज़र इंटरफ़ेस (यूआई) के उन ज़रूरी कॉम्पोनेंट की पहचान कर सकते हैं जिन्हें ओवरले नहीं किया जाना चाहिए. सिस्टम, इन कॉम्पोनेंट को कवर करने से बचने के लिए, पीआईपी विंडो की जगह बदलकर अनुरोधों को पूरा करने की कोशिश करता है.
यह बताने के लिए कि किसी व्यू को ओवरले नहीं किया जाना चाहिए, अपने एक्सएमएल लेआउट में 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 के लिए, मेटा-डेटा वैल्यू एट्रिब्यूट का एलान करना होगा. यह एट्रिब्यूट, पिक्चर में पिक्चर मोड के मुख्य टाइप या इस्तेमाल के टाइप से मेल खाता हो. android:supportsPictureInPicture="true" को सेट करने वाले किसी भी <activity> को इस एट्रिब्यूट की जानकारी, यहां दी गई टेबल में मौजूद काम की वैल्यू के साथ देनी चाहिए.
इस्तेमाल के ऐसे टाइप जो इनमें से किसी भी कैटगरी में नहीं आते, उन्हें टीवी पर पिक्चर में पिक्चर मोड में इस्तेमाल करने की अनुमति नहीं है. खास तौर पर, मीडिया कॉन्टेंट के किसी भी प्लेबैक को.
| वैल्यू | ब्यौरा |
|---|---|
"communication" |
कम्यूनिकेशन के लिए इस्तेमाल होने वाले ऐप्लिकेशन, जैसे कि वीडियो या वॉइस कॉल वाले ऐप्लिकेशन. |
"smartHome" |
स्मार्ट होम इंटिग्रेशन, जैसे कि कनेक्ट की गई दरवाज़े की घंटियां या शिशुओं की निगरानी करने वाले कैमरे. |
"health" |
सेहत से जुड़े मामलों में, जैसे कि फ़िटनेस ट्रैकिंग या सेहत की निगरानी करना. |
"ticker" |
टिकर के इस्तेमाल के उदाहरण, जैसे कि लाइव स्पोर्ट्स स्कोर या समाचार और स्टॉक टिकर. |
एक से ज़्यादा वैल्यू को वर्टिकल बार (|) से अलग किया जाता है. उदाहरण के लिए:
<meta-data android:name="com.google.android.tv.pip.category" android:value="smartHome|health" />