फ़ोल्ड किए जा सकने वाले डिवाइस, दर्शकों को वीडियो देखने का बेहतरीन अनुभव देते हैं. रीयर डिसप्ले मोड और ड्यूअल स्क्रीन मोड की मदद से, फ़ोल्ड किए जा सकने वाले डिवाइसों के लिए, डिसप्ले की खास सुविधाएं तैयार की जा सकती हैं. जैसे, पीछे के कैमरे से सेल्फ़ी की झलक और इनर और आउटर स्क्रीन पर, एक साथ अलग-अलग डिसप्ले दिखाना.
रीयर डिसप्ले मोड
आम तौर पर, जब फ़ोल्ड किया जा सकने वाला डिवाइस अनफ़ोल्ड होता है, तो सिर्फ़ इनर स्क्रीन चालू होती है. रीयर डिसप्ले मोड की मदद से, किसी गतिविधि को फ़ोल्ड किए जा सकने वाले डिवाइस की आउटर स्क्रीन पर ले जाया जा सकता है. यह सुविधा, आम तौर पर डिवाइस के अनफ़ोल्ड होने पर उपयोगकर्ता के सामने नहीं रहती. इनर डिसप्ले अपने-आप बंद हो जाता है.
एक नया ऐप्लिकेशन है, कैमरे की झलक को आउटर स्क्रीन पर दिखाने के लिए, इससे उपयोगकर्ता, रीयर कैमरे से सेल्फ़ी ले सकते हैं. आम तौर पर, यह फ़ोटो लेने की सुविधा को और बेहतर बनाता है.
पीछे वाला डिसप्ले मोड चालू करने के लिए, उपयोगकर्ता एक डायलॉग का जवाब देते हैं, ताकि ऐप्लिकेशन को स्क्रीन स्विच करने की अनुमति मिल सके. उदाहरण के लिए:
![](https://developer.android.com/static/images/guide/topics/large-screens/foldables/rear-display-dialog.png?authuser=9&hl=hi)
सिस्टम डायलॉग बनाता है, इसलिए आपकी ओर से किसी डेवलपमेंट की ज़रूरत नहीं होती. डिवाइस की स्थिति के आधार पर अलग-अलग डायलॉग दिखते हैं; उदाहरण के लिए, डिवाइस बंद होने पर, सिस्टम लोगों को डिवाइस अनफ़ोल्ड करने के निर्देश देता है. इस डायलॉग बॉक्स को अपनी पसंद के मुताबिक नहीं बनाया जा सकता. हालांकि, यह अलग-अलग OEM वाले डिवाइसों के हिसाब से अलग-अलग हो सकता है.
Pixel Fold के कैमरा ऐप्लिकेशन में, रीयर डिसप्ले मोड का इस्तेमाल किया जा सकता है. कोडलैब में, इसे लागू करने का सैंपल देखें. इसके लिए, कैमरे को अनफ़ोल्ड करें बटन पर क्लिक करें.
Dual Screen वाला मोड
Dual Screen वाले मोड की मदद से, फ़ोल्ड किए जा सकने वाले डिवाइस के दोनों डिसप्ले पर, एक साथ कॉन्टेंट दिखाया जा सकता है. ड्यूअल स्क्रीन मोड, Android 14 (एपीआई लेवल 34) या उसके बाद के वर्शन वाले Pixel Fold पर उपलब्ध है.
ड्यूअल स्क्रीन इंटरप्रेटर का इस्तेमाल करना, उदाहरण के लिए है.
![](https://developer.android.com/static/images/guide/topics/large-screens/foldables/dual-screen-interpreter.png?authuser=9&hl=hi)
प्रोग्राम के हिसाब से मोड चालू करें
लाइब्रेरी के वर्शन 1.2.0-beta03 की शुरुआत में, Jetpack WindowManager एपीआई की मदद से, रीयर डिसप्ले मोड और ड्यूअल स्क्रीन मोड को ऐक्सेस किया जा सकता है.
अपने ऐप्लिकेशन के मॉड्यूल build.gradle
फ़ाइल में WindowManager डिपेंडेंसी जोड़ें:
ग्रूवी
dependencies { implementation "androidx.window:window:1.2.0-beta03" }
Kotlin
dependencies { implementation("androidx.window:window:1.2.0-beta03") }
एंट्री पॉइंट WindowAreaController
है.
यह किसी डिवाइस पर डिसप्ले एरिया या डिसप्ले एरिया के बीच विंडो मूव करने से जुड़ी जानकारी और व्यवहार उपलब्ध कराता है.
WindowAreaController
आपको उपलब्ध सूची में से क्वेरी करने की सुविधा देता है
WindowAreaInfo
ऑब्जेक्ट हैं.
WindowAreaSession
को ऐक्सेस करने के लिए WindowAreaInfo
का इस्तेमाल करें,
ऐसा इंटरफ़ेस जो किसी ऐक्टिव विंडो एरिया की सुविधा को दिखाता है.
किसी खास प्रॉडक्ट की उपलब्धता तय करने के लिए, WindowAreaSession
का इस्तेमाल करें
WindowAreaCapability
.
हर सुविधा, किसी खास WindowAreaCapability.Operation
से जुड़ी होती है.
1.2.0-beta03 वर्शन में, Jetpack WindowManager दो तरह की कार्रवाइयों के साथ काम करता है:
WindowAreaCapability.Operation.OPERATION_PRESENT_ON_AREA
, जिसका इस्तेमाल ड्यूअल स्क्रीन मोड को चालू करने के लिए किया जाता हैWindowAreaCapability.Operation.OPERATION_TRANSFER_ACTIVITY_TO_AREA
, जिसका इस्तेमाल रीयर डिसप्ले मोड को चालू करने के लिए किया जाता है
यहां दिए गए उदाहरण में आपके ऐप्लिकेशन की मुख्य गतिविधि में, पीछे के डिसप्ले मोड और ड्यूअल स्क्रीन मोड के लिए वैरिएबल का एलान करने का तरीका बताया गया है:
Kotlin
private lateinit var windowAreaController: WindowAreaController private lateinit var displayExecutor: Executor private var windowAreaSession: WindowAreaSession? = null private var windowAreaInfo: WindowAreaInfo? = null private var capabilityStatus: WindowAreaCapability.Status = WindowAreaCapability.Status.WINDOW_AREA_STATUS_UNSUPPORTED private val dualScreenOperation = WindowAreaCapability.Operation.OPERATION_PRESENT_ON_AREA private val rearDisplayOperation = WindowAreaCapability.Operation.OPERATION_TRANSFER_ACTIVITY_TO_AREA
Java
private WindowAreaControllerCallbackAdapter windowAreaController = null; private Executor displayExecutor = null; private WindowAreaSessionPresenter windowAreaSession = null; private WindowAreaInfo windowAreaInfo = null; private WindowAreaCapability.Status capabilityStatus = WindowAreaCapability.Status.WINDOW_AREA_STATUS_UNSUPPORTED; private WindowAreaCapability.Operation dualScreenOperation = WindowAreaCapability.Operation.OPERATION_PRESENT_ON_AREA; private WindowAreaCapability.Operation rearDisplayOperation = WindowAreaCapability.Operation.OPERATION_TRANSFER_ACTIVITY_TO_AREA;
आपकी गतिविधि के onCreate()
तरीके में वैरिएबल शुरू करने का तरीका यहां बताया गया है:
Kotlin
displayExecutor = ContextCompat.getMainExecutor(this) windowAreaController = WindowAreaController.getOrCreate() lifecycleScope.launch(Dispatchers.Main) { lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) { windowAreaController.windowAreaInfos .map { info -> info.firstOrNull { it.type == WindowAreaInfo.Type.TYPE_REAR_FACING } } .onEach { info -> windowAreaInfo = info } .map { it?.getCapability(operation)?.status ?: WindowAreaCapability.Status.WINDOW_AREA_STATUS_UNSUPPORTED } .distinctUntilChanged() .collect { capabilityStatus = it } } }
Java
displayExecutor = ContextCompat.getMainExecutor(this); windowAreaController = new WindowAreaControllerCallbackAdapter(WindowAreaController.getOrCreate()); windowAreaController.addWindowAreaInfoListListener(displayExecutor, this); windowAreaController.addWindowAreaInfoListListener(displayExecutor, windowAreaInfos -> { for(WindowAreaInfo newInfo : windowAreaInfos){ if(newInfo.getType().equals(WindowAreaInfo.Type.TYPE_REAR_FACING)){ windowAreaInfo = newInfo; capabilityStatus = newInfo.getCapability(presentOperation).getStatus(); break; } } });
कोई कार्रवाई शुरू करने से पहले, देखें कि क्या कोई खास सुविधा उपलब्ध है:
Kotlin
when (capabilityStatus) { WindowAreaCapability.Status.WINDOW_AREA_STATUS_UNSUPPORTED -> { // The selected display mode is not supported on this device. } WindowAreaCapability.Status.WINDOW_AREA_STATUS_UNAVAILABLE -> { // The selected display mode is not currently available to be enabled. } WindowAreaCapability.Status.WINDOW_AREA_STATUS_AVAILABLE -> { // The selected display mode is currently available to be enabled. } WindowAreaCapability.Status.WINDOW_AREA_STATUS_ACTIVE -> { // The selected display mode is already active. } else -> { // The selected display mode status is unknown. } }
Java
if (capabilityStatus.equals(WindowAreaCapability.Status.WINDOW_AREA_STATUS_UNSUPPORTED)) { // The selected display mode is not supported on this device. } else if (capabilityStatus.equals(WindowAreaCapability.Status.WINDOW_AREA_STATUS_UNAVAILABLE)) { // The selected display mode is not currently available to be enabled. } else if (capabilityStatus.equals(WindowAreaCapability.Status.WINDOW_AREA_STATUS_AVAILABLE)) { // The selected display mode is currently available to be enabled. } else if (capabilityStatus.equals(WindowAreaCapability.Status.WINDOW_AREA_STATUS_ACTIVE)) { // The selected display mode is already active. } else { // The selected display mode status is unknown. }
Dual Screen वाला मोड
अगर सुविधा पहले से ही चालू है, तो यहां दिए गए उदाहरण में सेशन को बंद कर दिया जाएगा,
या फिर presentContentOnWindowArea()
फ़ंक्शन को कॉल करता है:
Kotlin
fun toggleDualScreenMode() { if (windowAreaSession != null) { windowAreaSession?.close() } else { windowAreaInfo?.token?.let { token -> windowAreaController.presentContentOnWindowArea( token = token, activity = this, executor = displayExecutor, windowAreaPresentationSessionCallback = this ) } } }
Java
private void toggleDualScreenMode() { if(windowAreaSession != null) { windowAreaSession.close(); } else { Binder token = windowAreaInfo.getToken(); windowAreaController.presentContentOnWindowArea( token, this, displayExecutor, this); } }
WindowAreaPresentationSessionCallback
के तौर पर ऐप्लिकेशन की मुख्य गतिविधि के इस्तेमाल पर ध्यान दें.
एपीआई, लिसनर वाले तरीके का इस्तेमाल करता है: जब कॉन्टेंट प्रज़ेंट करने का अनुरोध किया जाता है
फ़ोल्ड किए जा सकने वाले डिवाइस के दूसरे डिसप्ले से कनेक्ट करने पर, एक सेशन शुरू हो जाता है
लिसनर के onSessionStarted()
तरीके से.
सेशन बंद करने पर, आपको onSessionEnded()
तरीके में इसकी पुष्टि करने वाला मैसेज मिलता है.
लिसनर बनाने के लिए, WindowAreaPresentationSessionCallback
इंटरफ़ेस लागू करें:
Kotlin
class MainActivity : AppCompatActivity(), windowAreaPresentationSessionCallback
Java
public class MainActivity extends AppCompatActivity implements WindowAreaPresentationSessionCallback
सुनने वाले को onSessionStarted()
, onSessionEnded(),
लागू करनी होंगी
और onContainerVisibilityChanged()
तरीके.
कॉलबैक के तरीके आपको सेशन की स्थिति की सूचना देते हैं. साथ ही, ऐप्लिकेशन को उसी हिसाब से अपडेट करने में आपकी मदद करते हैं.
onSessionStarted()
कॉलबैक को तर्क के तौर पर, WindowAreaSessionPresenter
मिलता है.
आर्ग्युमेंट वह कंटेनर है जो आपको किसी विंडो के एरिया को ऐक्सेस करने और कॉन्टेंट दिखाने की सुविधा देता है.
जब उपयोगकर्ता, ऐप्लिकेशन की मुख्य विंडो से बाहर जाता है, तब सिस्टम अपने-आप प्रज़ेंटेशन को खारिज कर सकता है. इसके अलावा, WindowAreaSessionPresenter#close()
पर कॉल करके प्रज़ेंटेशन को बंद भी किया जा सकता है.
अन्य कॉलबैक के लिए, आसानी से इस्तेमाल करने के लिए, फ़ंक्शन के मुख्य हिस्से में गड़बड़ियों की जांच करें और स्टेटस लॉग करें:
Kotlin
override fun onSessionStarted(session: WindowAreaSessionPresenter) { windowAreaSession = session val view = TextView(session.context) view.text = "Hello world!" session.setContentView(view) } override fun onSessionEnded(t: Throwable?) { if(t != null) { Log.e(logTag, "Something was broken: ${t.message}") } } override fun onContainerVisibilityChanged(isVisible: Boolean) { Log.d(logTag, "onContainerVisibilityChanged. isVisible = $isVisible") }
Java
@Override public void onSessionStarted(@NonNull WindowAreaSessionPresenter session) { windowAreaSession = session; TextView view = new TextView(session.getContext()); view.setText("Hello world, from the other screen!"); session.setContentView(view); } @Override public void onSessionEnded(@Nullable Throwable t) { if(t != null) { Log.e(logTag, "Something was broken: ${t.message}"); } } @Override public void onContainerVisibilityChanged(boolean isVisible) { Log.d(logTag, "onContainerVisibilityChanged. isVisible = " + isVisible); }
पूरे नेटवर्क में एक जैसा बनाए रखने के लिए, ड्यूअल स्क्रीन वाले आधिकारिक आइकॉन का इस्तेमाल करें. इससे, लोगों को Dual Screen वाले मोड को चालू या बंद करने का तरीका पता चलेगा.
काम करने वाला सैंपल देखने के लिए, DualScreenActivity.kt देखें.
रीयर डिसप्ले मोड
ड्यूअल स्क्रीन मोड की तरह, toggleRearDisplayMode()
का आगे दिया गया उदाहरण
अगर सुविधा पहले से चालू है, तो फ़ंक्शन सेशन को बंद कर देता है,
या फिर transferActivityToWindowArea()
फ़ंक्शन को कॉल करता है:
Kotlin
fun toggleRearDisplayMode() { if(capabilityStatus == WindowAreaCapability.Status.WINDOW_AREA_STATUS_ACTIVE) { if(windowAreaSession == null) { windowAreaSession = windowAreaInfo?.getActiveSession( operation ) } windowAreaSession?.close() } else { windowAreaInfo?.token?.let { token -> windowAreaController.transferActivityToWindowArea( token = token, activity = this, executor = displayExecutor, windowAreaSessionCallback = this ) } } }
Java
void toggleDualScreenMode() { if(capabilityStatus == WindowAreaCapability.Status.WINDOW_AREA_STATUS_ACTIVE) { if(windowAreaSession == null) { windowAreaSession = windowAreaInfo.getActiveSession( operation ) } windowAreaSession.close() } else { Binder token = windowAreaInfo.getToken(); windowAreaController.transferActivityToWindowArea(token, this, displayExecutor, this); } }
इस मामले में, दिखाई गई गतिविधि का इस्तेमाल WindowAreaSessionCallback,
के तौर पर किया जाता है
इसे लागू करना आसान होता है, क्योंकि कॉलबैक को कोई प्रज़ेंटर नहीं मिलता
जो विंडो पर कॉन्टेंट दिखाने की अनुमति देता है, लेकिन इसके बजाय यह पूरी गतिविधि को किसी दूसरे हिस्से में ट्रांसफ़र कर देता है:
Kotlin
override fun onSessionStarted() { Log.d(logTag, "onSessionStarted") } override fun onSessionEnded(t: Throwable?) { if(t != null) { Log.e(logTag, "Something was broken: ${t.message}") } }
Java
@Override public void onSessionStarted(){ Log.d(logTag, "onSessionStarted"); } @Override public void onSessionEnded(@Nullable Throwable t) { if(t != null) { Log.e(logTag, "Something was broken: ${t.message}"); } }
पूरे नेटवर्क में समानता बनाए रखने के लिए, पीछे वाले कैमरे के आधिकारिक आइकॉन का इस्तेमाल करके, उपयोगकर्ताओं को रीयर डिसप्ले मोड को चालू या बंद करने का तरीका बताएं.
अन्य संसाधन
- कोडलैब के लिए अपने कैमरे का अनुभव बेहतर बनाएं
androidx.window.area
पैकेज की खास जानकारी- Jetpack WindowManager सैंपल कोड:
आपके लिए सुझाव
- ध्यान दें: JavaScript बंद होने पर लिंक टेक्स्ट दिखता है
- Jetpack WindowManager की मदद से, फ़ोल्ड किए जा सकने वाले डिवाइसों पर कैमरा ऐप्लिकेशन को ऑप्टिमाइज़ करना