Đị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 qua thao tác chạm, vì không có cơ chế liên kết giữa màn hình và phương thức nhập thiết bị. Ví dụ: màn hình cảm ứng có thể cung cấp đầu ra video HDMI (sẽ đăng ký làm màn hình trên Android) và đầu ra USB cho màn hình cảm ứng (sẽ đăng ký làm thiết bị đầu vào). Nếu nhiều thiết bị được kết nối trong theo cách này, sẽ không có cách nào để xác định xem thiết bị đầu vào nào thuộc về màn hình nào. Vấn đề này 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 công cụ màn hình.

Android 10 thêm một cơ chế để chỉ định dữ liệu đầu vào nào thiết bị thuộc về màn hình nào. Việc liên kết được thực hiện bằng số cổng nơi cổng đề cập đến cổng thực tế kết nối với màn hình.

Ví dụ: nếu một thiết bị Android có hai cổng HDMI được gắn nhãn hdmi1hdmi2, thì 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 đã 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 thiết bị Cổng HDMI. Nhờ đó, nhà sản xuất thiết bị có thể 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 này đã đượ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ổng được liên kết với các thiết bị cụ thể, hãy sử dụng lệnh trong dòng lệnh sau đây, sau đó xem lại thuộc tính location của các thiết bị đó trong Trạng thái của Trung tâm sự kiện.

adb shell dumpsys input

Nếu có 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 sự kiện gần đây nhất. Sau đó, bạn có thể thấy thiết bị tương ứng ở Trạng thái 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 rồi tìm address của DisplayDeviceInfo cho mỗi màn hình trong 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ả các màn hình được kết nối. Xem thêm Mã nhận dạng hiển thị 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à thiết bị tương ứng không có trong hệ thống, thiết bị đầu vào bị tắt cho đến khi màn hình xuất hiện. Việc liên kết chỉ được thực hiện cho các thiết bị cảm ứng.

Định tuyến cho màn hình linh hoạt trên nhiều màn hình

Android 10 cho phép bạn thiết lập chế độ nhiều màn hình tĩnh thiết bị. Mối liên kết linh động chưa được bật. Tuy nhiên, một số trường hợp sử dụng có thể được giải quyết bằng cách cung cấp thông tin định tuyến cho màn hình và bảng điều khiển đầu vào không được luôn hiển thị hoặc sử dụng thiết bị đầu vào ảo rồi cung cấp định tuyến bổ sung vào 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 khi có đế sạc, thì cấu hình định tuyến có thể được cung cấp để nhắm mục tiêu đầu vào từ phụ kiện đầu vào được kết nối với đế (đã xác định) duy nhất theo cổng) sang màn hình bên ngoài (được xác định bằng 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 màn hình bên ngoài thì có thể cung cấp cấu hình định tuyến để đích đầ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) đến màn hình bên ngoài (được xác định theo cổng).

Triển khai

  • Đối với thiết bị thực, cổng mà thiết bị đầu vào được kết nối và cổng mà màn hình được kết nối, 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 cổng thiết bị đầu vào được chỉ định trong tệp ánh xạ và hiện không phải là khung nhìn có cổng hiển thị phù hợp, thì đầu vào thiết bị trên cổng đó đã bị tắt.
  • Nếu cổng không được chỉ định 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 hành.
  • Không yêu cầu thay đổi hạt nhân trong trình điều khiển đầu vào.
  • Các cổng của thiết bị đầu vào được xác định bằng EVIOCGPHYS ioctl.