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