Android 9 और उससे पहले के वर्शन में, टच की मदद से एक से ज़्यादा डिसप्ले के साथ इंटरैक्ट करने का कोई तरीका नहीं था. इसकी वजह यह थी कि डिसप्ले और इनपुट डिवाइसों के बीच कोई असोसिएशन मैकेनिज्म नहीं था. उदाहरण के लिए, टचस्क्रीन डिसप्ले में एचडीएमआई वीडियो आउटपुट (यह Android पर डिसप्ले के तौर पर रजिस्टर होगा) और टचस्क्रीन के लिए यूएसबी आउटपुट (यह इनपुट डिवाइस के तौर पर रजिस्टर होगा) हो सकता है. अगर एक से ज़्यादा डिवाइस इस तरह से कनेक्ट किए गए थे, तो यह तय करने का कोई तरीका नहीं होगा कि कौनसा इनपुट डिवाइस किस डिसप्ले से जुड़ा है. यही समस्या, फ़ोल्ड किए जा सकने वाले उन डिवाइसों पर भी लागू होती है जिनमें एक से ज़्यादा डिवाइस पहले से मौजूद होते हैं दिखाता है.
Android 10 में एक सुविधा जोड़ी गई है, ताकि यह तय किया जा सके कि कौनसे इनपुट डिवाइस किस डिसप्ले से जुड़े हैं. डिसप्ले को पोर्ट नंबर के हिसाब से जोड़ा जाता है. यहां पोर्ट से उस फ़िज़िकल पोर्ट का मतलब है जिससे डिसप्ले कनेक्ट होता है.
उदाहरण के लिए, अगर किसी Android डिवाइस में hdmi1
लेबल वाले दो एचडीएमआई पोर्ट हैं
और hdmi2
है, तो डिसप्ले पोर्ट की वैल्यू 1
और
2
. पोर्ट की वैल्यू तब भी एक जैसी रहती हैं, जब एक ही एचडीएमआई पोर्ट से कोई दूसरा डिसप्ले (जैसे, कोई दूसरा डिसप्ले मॉडल या मैन्युफ़ैक्चरर) कनेक्ट किया जाता है. इससे डिवाइस बनाने वाली कंपनियां, डिसप्ले को असेम्बल करने और अपग्रेड करने के निर्देश दे सकती हैं.
असोसिएशन को /vendor/etc/input-port-associations.xml
में कॉन्फ़िगर किया गया है.
उदाहरण के लिए:
<ports>
<port display="0" input="usb-xhci-hcd.0.auto-1.1/input0" />
<port display="1" input="usb-xhci-hcd.0.auto-1.2/input0" />
</ports>
ऊपर दिए गए उदाहरण में, display="0"
उस पोर्ट की जानकारी देता है जिससे डिसप्ले कनेक्ट है. input="usb-xhci-hcd.0.auto-1.1/input0"
उस पोर्ट के बारे में बताता है जिससे इनपुट डिवाइस कनेक्ट है. पोर्ट तय करने के लिए
करने के लिए, नीचे दिए गए टर्मिनल निर्देश का इस्तेमाल करें. इसके बाद,
Event Hub की स्थिति में उन डिवाइसों की location
प्रॉपर्टी की समीक्षा करें.
adb shell dumpsys input
अगर कई डिवाइस कनेक्ट हैं, तो
इनपुट डिस्पैचर की स्थिति में RecentQueue
कलेक्शन. इसके बाद, उन डिवाइसों की पहचान की जा सकती है जिन्होंने हाल ही में इवेंट जनरेट किया है. इसके बाद, इवेंट हब स्टेटस में उस डिवाइस को ढूंढा जा सकता है.
कनेक्ट किए गए डिसप्ले के लिए असाइन किए गए डिसप्ले पोर्ट का पता लगाने के लिए, इसका इस्तेमाल करें
adb shell dumpsys display
और फिर address
देखें
DisplayDeviceInfo
की प्रॉपर्टी है.
इसके अलावा, कनेक्ट किए गए सभी डिसप्ले की पहचान से जुड़ी जानकारी को डंप करने के लिए, adb shell dumpsys SurfaceFlinger --display-id
का इस्तेमाल करें. इन्हें भी देखें
स्टैटिक डिसप्ले आइडेंटिफ़ायर.
अगर किसी इनपुट डिवाइस और उससे जुड़े सिस्टम में डिस्प्ले मौजूद नहीं है, तो इनपुट डिवाइस तब तक अक्षम रहता है जब तक डिसप्ले दिखता है. यह असोसिएशन सिर्फ़ टच डिवाइसों के लिए किया जाता है.
डाइनैमिक मल्टी-डिसप्ले के लिए रूटिंग
Android 10 की मदद से, एक से ज़्यादा डिसप्ले वाले स्टैटिक डिवाइसों को सेट अप किया जा सकता है. डाइनैमिक असोसिएशन की सुविधा अभी चालू नहीं है. हालांकि, इसके इस्तेमाल के कुछ उदाहरण उन डिसप्ले और इनपुट पैनल के लिए रूटिंग की जानकारी देकर पता लगाया जाता है जो वर्चुअल इनपुट डिवाइस का इस्तेमाल करना या हमेशा मौजूद होना और फिर अतिरिक्त रूटिंग देना उन वर्चुअल डिवाइसों को जानकारी देना. अगर डिवाइस पर ये सुविधाएं काम करती हैं, तो:
- डॉकिंग स्टेशन की मदद से, डेस्कटॉप जैसा अनुभव मिलता है. ऐसे में, डॉक से कनेक्ट की गई इनपुट ऐक्सेसरी (पोर्ट से यूनीक तौर पर पहचानी जाती है) से बाहरी डिसप्ले (पोर्ट से पहचानी जाती है) पर इनपुट को टारगेट करने के लिए, राऊटिंग कॉन्फ़िगरेशन दिया जा सकता है.
- बाहरी डिसप्ले से कनेक्ट होने पर, मुख्य स्क्रीन इनपुट सोर्स (जैसे, टचपैड) के तौर पर काम करती है. ऐसे में, वर्चुअल टच पैनल (यूनीक वर्चुअल आईडी से पहचाना जाता है) से बाहरी डिसप्ले (पोर्ट से पहचाना जाता है) पर इनपुट को टारगेट करने के लिए, रूटिंग कॉन्फ़िगरेशन दिया जा सकता है.
लागू करना
- फ़िज़िकल डिवाइसों के लिए, वह पोर्ट जिससे इनपुट डिवाइस कनेक्ट है और जिस पोर्ट से डिस्प्ले कनेक्ट है, उसका उपयोग टचस्क्रीन वाले डिस्प्ले से मिलान करने के लिए किया जाता है.
- मैपिंग,
InputReaderConfiguration
में सेव की जाती हैं. TouchInputMapper.mViewport
को उस व्यूपोर्ट पर सेट किया गया है जो मेल खाता हैInputDevice.location
के लिए तय किया गया पोर्ट.- यदि मैपिंग फ़ाइल में इनपुट डिवाइस पोर्ट के बारे में बताया गया है, और फ़िलहाल, ऐसा व्यूपोर्ट नहीं है जिसमें मिलता-जुलता डिसप्ले पोर्ट है, तो इनपुट उस पोर्ट के डिवाइस को बंद कर दिया गया हो.
- अगर किसी इनपुट डिवाइस के लिए कोई पोर्ट तय नहीं किया गया है, तो व्यूपोर्ट को मौजूदा नियमों के अनुसार सेट किया जा सकता है.
- इनपुट ड्राइवर में, कर्नेल में कोई बदलाव करने की ज़रूरत नहीं है.
- इनपुट डिवाइस पोर्ट का पता, EVIOCGPHYS ioctl का इस्तेमाल करके लगाया जाता है.