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