web-dev-qa-db-ja.com

ADBを使用してイベントタッチを電話に送信するが、リリースできない

CM13を実行しているHTC 10があります。ADBを使用してタッチイベントを送信しようとしています。これを送信した後、イベントを送信します。

adb Shell
sendevent /dev/input/event6 3 57 0
sendevent /dev/input/event6 3 53 300
sendevent /dev/input/event6 3 54 400
sendevent /dev/input/event6 3 48 5
sendevent /dev/input/event6 3 58 50
sendevent /dev/input/event6 0 2 0
sendevent /dev/input/event6 0 0 0

Showtouchesをオンにした状態で電話をクリックすると、タッチが開始されたように見えますが、タッチはまだ電話でアクティブです。

私の読書 here および here と他の場所に基づいて、私がしなければならないすべては次のとおりです:

sendevent /dev/input/event6 3 57 -1
sendevent /dev/input/event6 0 2 0
sendevent /dev/input/event6 0 0 0

または多分ちょうど

sendevent /dev/input/event6 3 57 -1
sendevent /dev/input/event6 0 0 0

ただし、これらのコマンドはどちらも、電話でのタッチが終了することにはなりません。

これらすべてを電話自体のシェルスクリプトに入れて、adbシェルからスクリプトを実行してみましたが、結果は同じでした。タッチの始まりであり、終わりではありません。

4
Chris D

あなたの環境はありませんが、問題を調査しました。あなたがしたように、見つけられるべき様々な記事がありますが、それらは常に一部の人には効果があるように見えますが、他の人には効果がないようです。電話ハードウェア/ Androidバージョン/ SDKバージョンの組み合わせには違いがあるため、すべての設定に1つの解決策はないというのが私の結論です。

あなたはあなたのために何がうまくいくかを見つける必要があります。ソフトウェアのメジャーアップデートにより、常に最初の段階に戻ることができることを覚えておいてください。

私が見つけた最も簡単な方法は、input tap x yコマンドを使用することです。

adb Shell input tap x y

すべてのinputバージョンにtapパラメータがあるわけではありませんが、引数なしで開始すると、使用可能なすべてのパラメータと構文が出力されます。

Shell@m0:/ $ input
input
usage: input ...
       input text <string>
       input keyevent <key code number or name>
       input [touchscreen|touchpad|touchnavigation] tap <x> <y>
       input [touchscreen|touchpad|touchnavigation] swipe <x1> <y1> <x2> <y2> [duration(ms)]
       input trackball press
       input trackball roll <dx> <dy>

別の方法は、 Getevent を使用して、画面をタッチしたときに発生するイベントを記録することです。 here から取得:

一連のイベントを記録する

  1. ファイルにデータを記録するようにPCを設定する(/tmp/Android-touch-events.log

    $ adb Shell getevent | grep --line-buffered ^/ | tee /tmp/Android-touch-events.log
    
  2. 電話で何かする
  3. pCでadbコマンドをctrl-cで停止します

記録されたイベントを再生する

このコマンドはawkで16進変換を行います

$ awk '{printf "%s %d %d %d\n", substr($1, 1, length($1) -1), strtonum("0x"$2), strtonum("0x"$3), strtonum("0x"$4)}' /tmp/Android-touch-events.log | xargs -l adb Shell sendevent

Geteventはパラメーターを16進数で表示しますが、上記のスクリプトが修正しようとする10進数のみの入力を受け入れるという落とし穴に注意してください。

monkeyrunner は、示されているように、使用できる別のツールです here

次のように monkeyrunner を使用することができます。

$ monkeyrunner
>>> from com.Android.monkeyrunner import MonkeyRunner, MonkeyDevice
>>> device = MonkeyRunner.waitForConnection()
>>> device.touch(200, 400, MonkeyDevice.DOWN_AND_UP)

ドラッグを行ったり、アクティビティを開始したりすることもできます。APIで MonkeyDevice を確認してください。

参照:

10
harrymc