In Android 9 e versioni precedenti, non era possibile interagire con più display tramite tocco, perché non esisteva un meccanismo di associazione tra display e dispositivi di input. Ad esempio, un display touchscreen potrebbe fornire un'uscita video HDMI (che verrà registrata come display su Android) e un'uscita USB per il touchscreen (che verrà registrata come dispositivo di input). Se più dispositivi fossero collegati in questo modo, non ci sarebbe modo di determinare a quale display appartiene ciascun dispositivo di input. Lo stesso problema si applica ai dispositivi pieghevoli con più display integrati.
Android 10 ha aggiunto un meccanismo per specificare a quali display appartengono i dispositivi di input. L'associazione viene eseguita in base ai numeri di porta, dove porta si riferisce alla porta fisica a cui è collegato un display.
Ad esempio, se un dispositivo Android ha due porte HDMI etichettate hdmi1
e hdmi2
, i valori della porta DisplayPort potrebbero essere 1
e
2
. I valori della porta rimangono invariati anche quando viene collegato un display diverso (ad esempio un modello o un produttore diverso) alla stessa porta HDMI fisica. In questo modo, i produttori di dispositivi possono fornire istruzioni per assemblare
e aggiornare i display.
L'associazione è configurata in /vendor/etc/input-port-associations.xml
.
Ad esempio:
<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>
Nell'esempio precedente, display="0"
specifica la porta a cui è collegato il display. input="usb-xhci-hcd.0.auto-1.1/input0"
specifica la porta a cui è collegato il dispositivo di input. Per determinare le porte associate a dispositivi specifici, utilizza il seguente comando del terminale, quindi esamina la proprietà location
di questi dispositivi nello stato di Event Hub.
adb shell dumpsys input
Se sono connessi molti dispositivi, tocca un dispositivo specifico per esaminare l'array RecentQueue
nello stato di Input Dispatcher. Puoi quindi identificare
gli dispositivi che hanno generato l'evento più recente. Puoi trovare il dispositivo corrispondente nello stato Event Hub.
Per determinare le porte di visualizzazione assegnate ai display collegati, utilizza
adb shell dumpsys display
e poi cerca la proprietà address
di DisplayDeviceInfo
per ogni display in Dispositivi di visualizzazione.
In alternativa, utilizza adb shell dumpsys SurfaceFlinger --display-id
per eseguire il dump
delle informazioni di identificazione di tutti i display connessi. Vedi anche
Identificatori di visualizzazione statici.
Se specifichi un'associazione per un dispositivo di input specifico e il display corrispondente non è presente nel sistema, il dispositivo di input viene disattivato finché non viene visualizzato il rispettivo display. L'associazione viene eseguita solo per i dispositivi touch.
Routing per più display dinamici
Android 10 ti consente di configurare dispositivi statici con più display. Le associazioni dinamiche non sono ancora attivate. Tuttavia, alcuni casi d'uso possono essere affrontati fornendo informazioni di routing per display e pannelli di input non sempre presenti o utilizzando dispositivi di input virtuali, nonché fornendo ulteriori informazioni di routing a questi dispositivi virtuali. Se un'implementazione del dispositivo supporta:
- Esperienza simile a un computer con una base di ricarica, quindi è possibile fornire una configurazione di routing per scegliere come target l'input dall'accessorio di input collegato alla base (identificato in modo univoco dalla porta) al display esterno (identificato dalla porta).
- Lo schermo principale agisce come sorgente di input (ad esempio un touchpad) quando è collegato al display esterno. È quindi possibile fornire una configurazione di routing per l'input di destinazione dal pannello touch virtuale (identificato da un ID virtuale univoco) al display esterno (identificato dalla porta).
Implementazione
- Per i dispositivi fisici, la porta a cui è collegato il dispositivo di input e la porta a cui è collegato il display vengono utilizzate per abbinare i display ai touchscreen.
- Le mappature vengono archiviate in
InputReaderConfiguration
. TouchInputMapper.mViewport
è impostato sull'area visibile corrispondente alla porta specificata perInputDevice.location
.- Se nel file di mappatura è specificata una porta del dispositivo di input e al momento non è presente un riquadro con una porta di visualizzazione corrispondente, il dispositivo di input su quella porta viene disattivato.
- Se non è specificata una porta per un determinato dispositivo di input, il viewport viene impostato in base alle regole esistenti.
- Non sono necessarie modifiche al kernel nei driver di input.
- Le porte del dispositivo di input vengono determinate utilizzando l'ioctl EVIOCGPHYS.