【Android】プログラムから端末をタッチする【ADB】

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

プログラムから端末をタッチする方法を紹介します。 通信機能と組み合わせると、遠隔地にある端末をタッチするといったことも可能になります。 今回は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コマンドを送って、結果を返すと言ったことも可能です。 通信機能との連携は機会があれば書こうと思います。