

Android端末はマウスを繋ぐと画面にカーソルが出てきて操作できるようになると思います。  
私はAndroid端末にBluetoothマウスをペアリングし接続して使っているのですが、このマウスの移動量をAndroidアプリ上で取得したいと考えています。

普通ならMotionEventのhoverで取得できるのですが、カーソルが画面より外に出ようとした場合、勝手に座標が画面内に移動させられるのでgetXなどをしても座標が変わらないままだと思います。それで困っています。  
PCで取得するときは愚直にカーソルを画面の中心に戻し、マウスを動かした後の座標と中心との差を毎フレーム取得していました。

ですが少し調べた結果、AndroidではRoot化でもしないとセキュリティの都合上マウスカーソル自体を動かすのは難しそうということがわかりました。  
Bluetoothで取得している移動量情報などをアプリ側で取得できるのであれば最高なのですがそのような方法は存在するのでしょうか。

現在はやむを得ず、PCで移動量を取得してUDPでスマホに送っていますが、最大で数秒程度の遅延があります。  
マウスを改造して移動量取得をしようともしたのですが、とても小さいBluetoothマウスを使っているのでハンダ付け出来そうにありません。  
NDKでAMOTION_getRawX()したのですが，画面の座標を返すだけでした...

どうにか移動量をアプリで直接取得したいです。どうか力を貸してください。よろしくお願いします。


CC BY-SA 4.0
2016-06-27T05:25:50.020
27106
2021-03-07T05:09:03.763
2021-03-07T05:09:03.763
3060
16964
question
java android bluetooth
Android端末に接続しているBluetoothマウスの移動量をアプリで取得する方法


自己解決しました！！

Android Terminal Emulatorというアプリを使ってADBをスタートし，アプリからADBコマンド `adb shell getevent
-lt /dev/input/event5`を発行します．  
`event5` はデバイスによって変わるので, `adb shell getevent -i`で確認してください．

マウスを操作すると`REL_X`と`REL_Y`の項目がログに含まれているのがわかります．  
これがマウスの移動量です．ちゃんと画面端でも移動量は送られ続けます．

あとは値を16進数の文字列からIntに変換してあげます．  
`int d = (int)Long.parseLong(hexValue, 16);`

欲を言えば外部アプリを使いたくないので，ソースを読んでそのうち組み込んで完全に自アプリのみにしたいですが，これで一応やりたいことはできました！


CC BY-SA 3.0
2016-07-10T12:22:04.600
27504
2016-07-10T12:22:04.600
16964
27106
answer


`onGenericMotionEvent`をオーバーライドすればマウスの移動（ACTION_HOVER_MOVE）のMotionEventが取得できます。  
ドラッグなどでは`onGenericMotionEvent`は呼ばず、`onTouchEvent`が呼ばれるようです。


CC BY-SA 3.0
2016-07-11T03:12:21.803
27518
2016-07-11T03:12:21.803
9498
27106
answer