【Android】プログラムから端末をタッチする【ADB】
はじめに
プログラムから端末をタッチする方法を紹介します。 通信機能と組み合わせると、遠隔地にある端末をタッチするといったことも可能になります。 今回はRoot化したNexus7(2013)を使いました。
タッチ情報の操作
USB接続した端末にターミナルから以下のコマンドを打ちます。
Nexus7の場合
adb shell getevent /dev/input/event0
Nexus5の場合
adb shell getevent /dev/input/event1
端末ごとに/dev/input/~ 以下が違うようです。
コマンド入力後,端末をタッチするとターミナルに以下のように表示されます。
0003 0039 00001a6c 0003 0035 00000167 0003 0036 00000252 0003 003a 0000003a 0003 0030 00000005 0003 0034 00000000 0000 0000 00000000 0003 0039 ffffffff 0000 0000 00000000
これはタッチ情報を取り出したもので,左からイベントのタイプ、イベントのコード、イベントの値が16進数で表示されています。
geteventはタッチ情報を取得するコマンドですが 逆にイベントを端末に送るsendeventというコマンドがあり これはタッチ情報を端末に送るコマンドになります。
スワイプやマルチタッチになるとこれらを全て取り出して処理をする必要がありますが タッチだけなら下のsendevent8ペアで1タッチになります
sendevent /dev/input/event0 3 57 "id" sendevent /dev/input/event0 3 48 10 sendevent /dev/input/event0 3 58 29 sendevent /dev/input/event0 3 53 "x" sendevent /dev/input/event0 3 54 "y" sendevent /dev/input/event0 0 0 0 sendevent /dev/input/event0 3 57 4294967295 sendevent /dev/input/event0 0 0 0 sleep 0.000\n
こちらも値が左からイベントのタイプ、イベントのコード、イベントの値と同じですが 気をつけないといけないのは、geteventで取得した値と違い 10進数を入力する必要があるので geteventで取得した値をsendeventで送りたい場合は16進数から10進数に変える必要があります。
上記の”x”と”y”に座標を入力することで、端末の任意の場所をタップすることができます。 idの場所には同じ数字が入らないようにします。 他にはタッチ時の断面積とタッチの圧力などがありますが タッチするだけならあまり関係ありません。
複数回のタップをする場合はsleepで間をおくことができます。
プログラム中で実行させるには
int touch_id; Process p; public void touch(touch_x,touch_y){ String tap = "sendevent /dev/input/event0 3 57 " + touch_id + "\n" + "sendevent /dev/input/event0 3 48 10\n" + "sendevent /dev/input/event0 3 58 29\n" + "sendevent /dev/input/event0 3 53 " + touch_x + "\n" + "sendevent /dev/input/event0 3 54 " + touch_y + "\n" + "sendevent /dev/input/event0 0 0 0\n" + "sendevent /dev/input/event0 3 57 4294967295\n" + "sendevent /dev/input/event0 0 0 0\n" + "sleep 0.000\n"; try { p = Runtime.getRuntime().exec("su"); DataOutputStream dos = new DataOutputStream(p.getOutputStream()); dos.writeBytes(tap); dos.flush(); dos.close(); } catch (IOException e) { e.printStackTrace(); } touch_id++; }
これでプログラム中でタップが実行されます。
まとめ
他にも input touchscreen swipe 500 500 1000 500 100 とすることでスワイプをしたり linuxコマンドを送って、結果を返すと言ったことも可能です。 通信機能との連携は機会があれば書こうと思います。