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 (sẽ đă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 (sẽ đă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 về màn hình nào. Việc liên kết được thực hiện bằng số cổng, trong đó cổng đề cập đến cổng vật lý mà màn hình được kết nối.
Ví dụ: nếu một thiết bị Android có 2 cổng HDMI được gắn nhãn hdmi1
và hdmi2
, thì các giá trị cổng hiển thị có thể là 1
và 2
. 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 giúp các 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 được liên kết với các thiết bị cụ thể, hãy dùng lệnh sau đây trên thiết bị đầu cuối, sau đó xem xét 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 của bộ đ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ể 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
rồi 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 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 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ị vô hiệu hoá cho đến khi màn hình tương ứng xuất hiện. Mối liên kết này 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 có nhiều màn hình. Chưa bật tính năng liên kết linh hoạ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 những màn hình và bảng điều khiển đầu vào không phải lúc nào cũng xuất hiện hoặc bằng cách sử dụng thiết bị đầu vào ảo, sau đó cung cấp thêm thông tin định tuyến cho những thiết bị ảo đó. Nếu một quy trình triển khai thiết bị hỗ trợ:
- Trải nghiệm như trên máy tính khi dùng trạm sạc, sau đó, bạn có thể cung cấp cấu hình định tuyến để nhắm đến dữ liệ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 riêng biệ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, sau đó có thể cung cấp cấu hình định tuyến để nhắm đến dữ liệ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 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 mà màn hình được kết nối sẽ đượ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 hiển thị khớp với cổng được chỉ định choInputDevice.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ó cổng hiển thị nào khớp, thì thiết bị đầu vào trên cổng đó sẽ bị vô hiệu hoá.
- Nếu bạn không chỉ định cổng cho một thiết bị đầu vào cụ thể, thì khung hiển thị 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.