Gestionar todos los eventos de mouse en Android

Bueno, la pregunta es bastante simple – ¿cómo puedo manejar izquierda / derecha / medio clic, rueda y (!) Movimiento hover en android 2/3/4.

He estado investigando este tema y he encontrado lo siguiente

  • En api 14 podemos manejar casi cualquier cosa con la nueva y elegante MotionEvent
  • También tenemos el accesorio abierto que parece ser aceptable con el ratón del USB puesto que el api 12 (que todavía falta el bluetooth) (UPD OA backported a 2.3.4)
  • Ratón realmente funciona bien en tabletas con ICS y nido de abeja y cianógeno 2.3.7, pero actúa como un solo toque en cada botón. Me pregunto si hay una manera de interceptar mensajes de ratón.

Ayúdame por favor a entender cómo puedo manejar el ratón bluetooth y usb de la manera más simple y correcta en cada versión de android. O decir que es imposible.

UPD2: parece USB Host sólo en 3.1+, mientras que el accesorio USB inútil para esta tarea

Estos son mis descubrimientos:

Para Nivel Api <9:

  • El botón primario del ratón externo se maneja como un toque de dedo normal. Parece que no hay manera de detectar el ratón.
  • El botón secundario se envía a través de un KeyEvent con KeyEvent.KEYCODE_BACK . No hay manera de distinguir entre las prensas "Back" actuales y las pulsaciones secundarias del botón.

Para Api Nivel 9+:

  • Se ha añadido un nuevo método MotionEvent.getSource() . Yo uso este para detectar si la entrada es de ratón.
  • El botón secundario todavía se envía a través de un KeyEvent con KeyEvent.KEYCODE_BACK . En algunos dispositivos KeyEvent.getSource() devuelve InputDevice.SOURCE_MOUSE , por lo que la detección de botones secundarios funciona en algunos casos.

Para Api Nivel 12+:

  • OnGenericMotionListener ha agregado OnGenericMotionListener . Utilizo éste para detectar movimientos del ratón con ACTION_HOVER_MOVE y los cambios de la rueda con ACTION_SCROLL .

Para Api Nivel 14+:

  • Nuevo método MotionEvent.getButtonState() . Rastro esto para distinguir si un botón primario, secundario, terciario del ratón es presionado cuando el MotionEvent.getActionMasked() es ACTION_MOVE , ACTION_DOWN o ACTION_UP .

No he mirado en Api nivel 15/16 o el tipo de herramienta, porque soy capaz de rastrear todos los eventos de ratón con lo que he descrito anteriormente. Sería interesante si alguien tiene información adicional o si me falta con 15/16 / tooltypes.

DE ACUERDO. Creo que tengo una pista. He leído lo más destacado sobre android 3.x / 4.x y se dio cuenta de que …

  1. Podemos usar el ratón en android 3+, en las versiones anteriores el ratón es específico del dispositivo

  2. Podemos interceptar eventos de ratón reconocidos desde cualquier fuente (BT o USB) …

2.1. … scroll o hover_move en 3.1+ en onGenericMotionEvent

2.2. … primaria, secundaria y terciaria botones y hover entrar / dejar en android 4.0 + (y, finalmente, TOOL_TYPE_MOUSE constante)

La otra opción es analizar datos bastante bajos de socket bluetooth o usb en modo host.

¿Estoy bien? Todavía me pregunto si alguien tiene mejor solución.

  • USB Accessory API en el Samsung Galaxy S2 Android
  • Uso de Android para comunicarse con un dispositivo USB HID
  • ¿Cómo acceder a un servicio web que se ejecuta en una PC Win7 desde un dispositivo Android no conectado a través de USB?
  • ¿Es posible identificar el modo de comunicación USB mediante programación?
  • ¿Cómo puedo determinar la longitud de los bytes recibidos del método UsbRequest.queue (..)?
  • ¿Alguien sabe la verdad sobre el conector USB a RJ45 en dispositivos Android?
  • ¿Hay una manera de comunicarse con dispositivos USB en Android?
  • NullPointerException de UsbManager
  • Nexus 7 no es recogido por adb (cuando lo conecto a la computadora portátil a través de usb)
  • USB debugging - Problema con la instalación de controladores para Epson Moverio
  • getDeviceList devuelve dispositivos que ya no están conectados
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.