Well, the question is rather simple - how can i handle left/right/middle click, wheel and (!)hover move in android 2/3/4.
I've been digging on this topic and found the following
- in api 14 we can handle almost anything with fancy new MotionEvent
- we also have Open Accessory that seems to be ok with USB mouse since api 12 (still missing bluetooth) (UPD OA backported to 2.3.4)
- mouse actually works well on tablets with ICS and Honeycomb and cyanogen 2.3.7, but act like just single touch on every button.I wonder is there a way to intercept mouse messages.
Help me please to understand how i can handle bluetooth and usb mouse in most simple and right way in each version of android. Or say its impossible.
UPD2: seems like USB Host only in 3.1+, while USB Accessory useless for this task
-
Read zdnet.com/blog/burnette/… and developer.android.com/reference/android/view/MotionEvent.htmlPankaj Kumar– Pankaj Kumar2012年10月03日 09:07:08 +00:00Commented Oct 3, 2012 at 9:07
-
1I looked at those articles, but a haven't found anything new. What are you hinting at?mjollneer– mjollneer2012年10月03日 09:33:36 +00:00Commented Oct 3, 2012 at 9:33
3 Answers 3
These are my findings:
For Api Level < 9:
- External mouse primary button is handled just as a normal finger touch. There seems to be no way to detect the mouse.
- Secondary button is dispatched trough a
KeyEventwithKeyEvent.KEYCODE_BACK. No way to distinguish between actual "Back" presses and secondary button presses.
For Api Level 9+:
- A new method has been added
MotionEvent.getSource(). I use this one to detect if input is from mouse. - Secondary button is still dispatched through a
KeyEventwithKeyEvent.KEYCODE_BACK. On some devices theKeyEvent.getSource()returnsInputDevice.SOURCE_MOUSE, so secondary button detection works in some cases.
For Api Level 12+:
OnGenericMotionListenerhas been added. I use this one to detect mouse moves withACTION_HOVER_MOVEand wheel changes withACTION_SCROLL.
For Api Level 14+:
- New method
MotionEvent.getButtonState(). I track this one to distinguish if a primary, secondary, tertiary mouse button is pressed when theMotionEvent.getActionMasked()isACTION_MOVE,ACTION_DOWNorACTION_UP.
I haven't looked into Api Level 15/16 or the tool type, because I'm able to track all mouse events with what I described above. Would be interesting if anybody has additional information or if I' missing out with 15/16/tooltypes.
8 Comments
ACTION_HOVER_MOVE will only happen as long as you don't press any buttons. If I remember correctly you should receive ACTION_MOVE while a mouse button is pressed. It has been a long time since the last time I looked at this, but there was definitely a way to track it.OK. I think i got a clue. I've read highlights about android 3.x/4.x and realized that...
we can use mouse in android 3+, in older versions mouse is device-specific
we can intercept recognized mouse events from any source (BT or USB)...
2.1. ... scroll or hover_move in 3.1+ in onGenericMotionEvent
2.2. ... primary, secondary, and tertiary buttons and hover enter/leave in android 4.0+ (and finally TOOL_TYPE_MOUSE constant)
The other option is to parse pretty lowlevel data from bluetooth socket or usb in host mode.
Am i right? Still wonder if anybody have better solution.
Comments
Please, consult the Android SDK documentation, exactly on your own SDK directory: android-sdk/docs/reference/android/view/MotionEvent.html