في الإصدار 9 من نظام التشغيل Android والإصدارات الأقدم، لم تكن هناك طريقة للتفاعل مع شاشات متعددة من خلال اللمس، لأنّه لم تكن هناك آلية ربط بين الشاشات وأجهزة input. على سبيل المثال، يمكن أن توفّر شاشة تعمل باللمس مخرج فيديو HDMI (سيتم تسجيله كشاشة على Android) ومخرج USB للشاشة التي تعمل باللمس (سيتم تسجيله كجهاز إدخال). في حال ربط أجهزة متعددة بهذه الطريقة، لن يكون هناك طريقة لتحديد جهاز الإدخال الذي ينتمي إلى الشاشة. تنطبق المشكلة نفسها على الأجهزة القابلة للطي التي تحتوي على عدة شاشة مدمجة.
أضاف نظام التشغيل Android 10 آلية لتحديد أجهزة الإدخال التي تنتمي إلى الشاشات. يتم إجراء عملية الربط حسب أرقام المنافذ حيث يشير المنفذ إلى المنفذ المادي الذي تم توصيل الشاشة به.
على سبيل المثال، إذا كان جهاز Android مزوّدًا بمنفذَي HDMI يحملان التصنيفَين hdmi1
وhdmi2
، يمكن أن تكون قيم منفذَي العرض 1
و
2
. تظلّ قيم المنفذ كما هي حتى في حال توصيله بشاشة مختلفة (مثل طراز شاشة أو شركة تصنيع مختلفة) بمنفذ HDMI المادي نفسه. يتيح ذلك لشركات تصنيع الأجهزة تقديم تعليمات لتجميع
الشاشات وترقيتها.
تم ضبط عملية الربط في /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"
يحدد المنفذ الذي تم توصيل جهاز الإدخال به. لتحديد المنافذ
المرتبطة بأجهزة معيّنة، استخدِم الأمر التالي في وحدة التحكّم الطرفية، ثم
راجِع سمةlocation
لهذه الأجهزة في حالة Event Hub.
adb shell dumpsys input
إذا كان هناك العديد من الأجهزة متصلة، انقر على جهاز معيّن لفحص صفيف
RecentQueue
في حالة "موزّع الإدخال". يمكنك بعد ذلك تحديد
الأجهزة التي أدّت إلى حدوث أحدث حدث. يمكنك بعد ذلك العثور على
الجهاز المقابل في حالة Event Hub.
لتحديد منافذ العرض المحدّدة للشاشات المتصلة، استخدِم adb shell dumpsys display
ثم ابحث عن سمة address
DisplayDeviceInfo
لكل شاشة ضمن "أجهزة العرض".
بدلاً من ذلك، يمكنك استخدام adb shell dumpsys SurfaceFlinger --display-id
لتفريغ
معلومات التعريف لجميع الشاشات المتصلة. يُرجى الاطّلاع أيضًا على
معرّفات الشاشة الثابتة.
إذا حدّدت عملية ربط لجهاز إدخال معيّن ولم تكن الشاشة المقابلة متوفّرة في النظام، يتم إيقاف جهاز الإدخال إلى أن تظهر الشاشة المعنيّة. لا يتم إجراء عملية الربط إلا للأجهزة التي تعمل باللمس.
توجيه الشاشات الديناميكية المتعددة
يتيح لك نظام التشغيل Android 10 إعداد أجهزة شاشات متعددة ثابتة. لم يتم تفعيل عمليات الربط الديناميكية بعد. ومع ذلك، يمكن التعامل مع بعض حالات الاستخدام من خلال تقديم معلومات توجيهية للوحات العرض ولوحات الإدخال التي لا تكون متوفّرة دائمًا أو باستخدام أجهزة إدخال افتراضية، ثم تقديم معلومات توجيه إضافية لتلك الأجهزة الافتراضية. إذا كان تنفيذ الجهاز يتيح ما يلي:
- تجربة مشابهة لأجهزة الكمبيوتر المكتبي باستخدام محطة الإرساء، ويمكن بعد ذلك توفير إعدادات توجيه لاستهداف الإدخال من ملحق الإدخال المتصل بقاعدة الإرساء (يتم تحديده بشكل فريد حسب المنفذ) إلى الشاشة الخارجية (يتم تحديده حسب المنفذ).
- الشاشة الأساسية التي تعمل كمصدر إدخال (مثل لوحة لمس) عند توصيلها بالشاشة الخارجية، يمكن بعد ذلك توفير إعدادات توجيه لاستهداف الإدخال من لوحة اللمس الافتراضية (المحدَّدة من خلال رقم تعريف افتراضي فريد) إلى الشاشة الخارجية (المحدَّدة من خلال المنفذ).
التنفيذ
- بالنسبة إلى الأجهزة المادية، يتم استخدام المنفذ الذي تم توصيل جهاز الإدخال به والمنفذ الذي تم توصيل الشاشة به لمطابقة الشاشات مع الشاشات التي تعمل باللمس.
- يتم تخزين عمليات الربط في
InputReaderConfiguration
. - يتم ضبط
TouchInputMapper.mViewport
على إطار العرض الذي يتطابق مع المنفذ المحدّد لـInputDevice.location
. - إذا تم تحديد منفذ جهاز إدخال في ملف الربط، ولم يكن هناك حاليًا إطار عرض يتضمّن منفذ شاشة مطابقًا، يتم إيقاف جهاز الإدخال على هذا المنفذ.
- إذا لم يتم تحديد منفذ لجهاز إدخال معيّن، يتم ضبط إطار العرض وفقًا للقواعد الحالية.
- لا يلزم إجراء أي تغييرات على النواة في برامج تشغيل الإدخال.
- يتم تحديد منافذ جهاز الإدخال باستخدام ioctl EVIOCGPHYS.