Định tuyến đầu vào

Trong Android 9 trở xuống, không có cách nào để tương tác với nhiều màn hình thông qua thao tác chạm vì không có cơ chế liên kết giữa màn hình và thiết bị đầu vào. Ví dụ: màn hình cảm ứng có thể cung cấp đầu ra video HDMI (được đăng ký dưới dạng màn hình trên Android) và đầu ra USB cho màn hình cảm ứng (được đăng ký dưới dạng thiết bị đầu vào). Nếu nhiều thiết bị được kết nối theo cách này, sẽ không có cách nào để xác định thiết bị đầu vào nào thuộc về màn hình nào. Vấn đề tương tự cũng xảy ra với các thiết bị có thể gập lại được tích hợp nhiều màn hình.

Android 10 đã thêm một cơ chế để chỉ định thiết bị đầu vào nào thuộc màn hình nào. Việc liên kết được thực hiện theo số cổng, trong đó cổng là cổng thực tế mà màn hình được kết nối.

Ví dụ: nếu một thiết bị Android có hai cổng HDMI được gắn nhãn hdmi1hdmi2, thì các giá trị cổng hiển thị có thể là 12. Các giá trị cổng vẫn giữ nguyên ngay cả khi một màn hình khác được kết nối (chẳng hạn như kiểu màn hình hoặc nhà sản xuất khác) với cùng một cổng HDMI thực. Điều này cho phép nhà sản xuất thiết bị cung cấp hướng dẫn để lắp ráp và nâng cấp màn hình.

Mối liên kết được định cấu hình trong /vendor/etc/input-port-associations.xml. Ví dụ:

<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>

Trong ví dụ trên, display="0" chỉ định cổng mà màn hình được kết nối. input="usb-xhci-hcd.0.auto-1.1/input0" chỉ định cổng mà thiết bị đầu vào được kết nối. Để xác định các cổng liên kết với các thiết bị cụ thể, hãy sử dụng lệnh dòng lệnh sau, sau đó xem lại thuộc tính location của các thiết bị đó trong Trạng thái của Event Hub.

adb shell dumpsys input

Nếu nhiều thiết bị được kết nối, hãy nhấn vào một thiết bị cụ thể để kiểm tra mảng RecentQueue trong Trạng thái trình điều phối đầu vào. Sau đó, bạn có thể xác định những thiết bị đã tạo ra sự kiện gần đây nhất. Sau đó, bạn có thể tìm thấy thiết bị tương ứng trong Trạng thái của Trung tâm sự kiện.

Để xác định các cổng hiển thị được gán cho các màn hình đã kết nối, hãy sử dụng adb shell dumpsys display, sau đó tìm thuộc tính address của DisplayDeviceInfo cho mỗi màn hình trong phần Thiết bị hiển thị. Ngoài ra, hãy sử dụng adb shell dumpsys SurfaceFlinger --display-id để kết xuất thông tin nhận dạng cho tất cả màn hình đã kết nối. Xem thêm về Giá trị nhận dạng màn hình tĩnh.

Nếu bạn chỉ định mối liên kết cho một thiết bị đầu vào cụ thể và màn hình tương ứng không có trong hệ thống, thì thiết bị đầu vào sẽ bị tắt cho đến khi màn hình tương ứng xuất hiện. Quá trình liên kết chỉ được thực hiện cho các thiết bị cảm ứng.

Định tuyến cho nhiều màn hình động

Android 10 cho phép bạn thiết lập các thiết bị tĩnh nhiều màn hình. Mối liên kết linh động chưa được bật. Tuy nhiên, bạn có thể giải quyết một số trường hợp sử dụng bằng cách cung cấp thông tin định tuyến cho màn hình và bảng đầu vào không phải lúc nào cũng xuất hiện hoặc sử dụng các thiết bị đầu vào ảo, sau đó cung cấp thêm thông tin định tuyến cho các thiết bị ảo đó. Nếu quá trình triển khai thiết bị hỗ trợ:

  • Trải nghiệm giống như trên máy tính để bàn với một trạm sạc, sau đó, bạn có thể cung cấp cấu hình định tuyến để nhắm mục tiêu đầu vào từ phụ kiện đầu vào được kết nối với trạm sạc (được xác định duy nhất theo cổng) đến màn hình ngoài (được xác định theo cổng).
  • Màn hình chính đóng vai trò là nguồn đầu vào (chẳng hạn như bàn di chuột) khi được kết nối với màn hình ngoài, thì cấu hình định tuyến có thể được cung cấp để nhắm mục tiêu đầu vào từ bảng điều khiển cảm ứng ảo (được xác định bằng mã nhận dạng ảo duy nhất) tới màn hình bên ngoài (được xác định bằng cổng).

Triển khai

  • Đối với các thiết bị thực, cổng mà thiết bị đầu vào được kết nối và cổng kết nối với màn hình, được dùng để khớp màn hình với màn hình cảm ứng.
  • Các mối liên kết được lưu trữ trong InputReaderConfiguration.
  • TouchInputMapper.mViewport được đặt thành khung nhìn khớp với cổng được chỉ định cho InputDevice.location.
  • Nếu một cổng thiết bị đầu vào được chỉ định trong tệp ánh xạ và hiện không có khung nhìn nào có cổng hiển thị phù hợp, thì thiết bị đầu vào trên cổng đó sẽ bị tắt.
  • Nếu bạn không chỉ định cổng cho một thiết bị đầu vào cụ thể, thì khung nhìn sẽ được đặt theo các quy tắc hiện có.
  • Không cần thay đổi hạt nhân trong trình điều khiển đầu vào.
  • Các cổng thiết bị đầu vào được xác định bằng cách sử dụng ioctl EVIOCGPHYS.