Đị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ó nhiều màn hình tích hợp.

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ư một mẫ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 chỉ định cho 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 từng 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 hiển thị tĩnh.

Nếu bạn chỉ định một 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. Thao tác 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ị nhiều màn hình tĩnh. Chưa bật mối liên kết động. 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 nhập không phải lúc nào cũng hiển thị hoặc sử dụng thiết bị nhập ảo, sau đó cung cấp thêm thông tin định tuyến cho các thiết bị ảo đó. Nếu việc 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 kết nối với màn hình bên ngoài, 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ừ bảng 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 bằng cổng).

Triển khai

  • Đối với thiết bị thực, cổng kết nối thiết bị đầu vào và cổng kết nối màn hình được dùng để so 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ó.
  • Bạn không cần thay đổi 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.