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