Androidでタッチイベントをシミュレートするにはどうすればよいですか?


101

X座標とY座標を手動で指定しながらAndroidでタッチイベントをシミュレートする方法は?


1
以下の有効な回答がいくつか得られますが、それらは小さな変更を加えることができるアプリケーションでのみ機能することに注意してください。変更できない他のアプリの場合、イベントを挿入するにはルート化されたプラットフォームが必要です。
Chris Stratton、2010

10秒ごとにx、yでタッチするアプリケーションを作成して最小化することはできますが、x、yでのタッチは続行できますか?
Dr.jacky 2014年

ルート要件なしで私の答えを確認してください。:)
Anand Varkey Philips、2017

回答:


110

ビューを拡張した場合はValentin Rocherのメソッドが機能しますが、イベントリスナーを使用している場合は、次のようにします。

view.setOnTouchListener(new OnTouchListener()
{
    public boolean onTouch(View v, MotionEvent event)
    {
        Toast toast = Toast.makeText(
            getApplicationContext(), 
            "View touched", 
            Toast.LENGTH_LONG
        );
        toast.show();

        return true;
    }
});


// Obtain MotionEvent object
long downTime = SystemClock.uptimeMillis();
long eventTime = SystemClock.uptimeMillis() + 100;
float x = 0.0f;
float y = 0.0f;
// List of meta states found here: developer.android.com/reference/android/view/KeyEvent.html#getMetaState()
int metaState = 0;
MotionEvent motionEvent = MotionEvent.obtain(
    downTime, 
    eventTime, 
    MotionEvent.ACTION_UP, 
    x, 
    y, 
    metaState
);

// Dispatch touch event to view
view.dispatchTouchEvent(motionEvent);

MotionEventオブジェクトの取得の詳細については、次の優れた答えがあります。Android:MotionEventを作成する方法は?


1
良い答えですが、Androidの初心者として、OnTouchListenerは私を混乱させました。シミュレーションにリスナーは必要ないことに気づきました。必要なのは、コードの後半のMotionEventだけです。
user1532390 2013年

eventTimeに100ミリ秒を追加するのはなぜですか?downTimeとeventTimeが同じ場合は機能しませんか?
tu-Reinstate Monica-dor duh 2014年

2
@tudor-実際のタッチをシミュレートするためだけ。downTimeユーザーが画面をタッチダウンするときですが、eventTimeこの場合、ユーザーが指を離すとき(ACTION_UP)になります。両方が同じ場合でも機能するかどうかはわかりません。テストして結果を投稿できます。
azdev 2014年

ビューオブジェクトをどのように宣言する必要がありますか?
TheLogicGuy 16

わかりました。左、右、上、下のスワイプジェスチャーはどうですか。ACTION_MOVEを使用してこれを行うにはどうすればよいですか。
Ramesh_D 2017

24

以下は、タッチとドラッグをアプリケーションに送信するmonkeyrunnerスクリプトです。私はこれを使用して、私のアプリケーションが高速で反復的なスワイプジェスチャーを処理できることをテストしています。

# This is a monkeyrunner jython script that opens a connection to an Android
# device and continually sends a stream of swipe and touch gestures.
#
# See http://developer.android.com/guide/developing/tools/monkeyrunner_concepts.html
#
# usage: monkeyrunner swipe_monkey.py
#

# Imports the monkeyrunner modules used by this program
from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice

# Connects to the current device
device = MonkeyRunner.waitForConnection()

# A swipe left from (x1, y) to (x2, y) in 2 steps
y = 400
x1 = 100
x2 = 300
start = (x1, y)
end = (x2, y)
duration = 0.2
steps = 2
pause = 0.2

for i in range(1, 250):
    # Every so often inject a touch to spice things up!
    if i % 9 == 0:
        device.touch(x2, y, 'DOWN_AND_UP')
        MonkeyRunner.sleep(pause)
    # Swipe right
    device.drag(start, end, duration, steps)
    MonkeyRunner.sleep(pause)
    # Swipe left
    device.drag(end, start, duration, steps)
    MonkeyRunner.sleep(pause)

1
MonkeyDevice.DOWN_AND_UP代わりに使用する必要があります'DOWN_AND_UP'。(これDOWN_AND_UPがデフォルトなので、コードは引き続き機能します)
ValarDohaeris

別のデバイス(Nexus 10)で試したところ、UPアクションの直後に再起動しました
Equidamoid

これを非テストクラスで使用できますか?
Dania 2016年

20

adbシェルコマンドを使用してタッチイベントをシミュレートする

adb shell input tap x y 

and also 

adb shell sendevent /dev/input/event0 3 0 5 
adb shell sendevent /dev/input/event0 3 1 29 

1
adbコマンドを使用してピンチズームをシミュレートしたいのですが、ピンチズームの座標があります
nikhil84

1

私が明確に理解している場合は、これをプログラムで実行する必要があります。次に、のonTouchEventメソッドを使用して、必要な座標でをView作成MotionEventできます。


1

新しいmonkeyrunnerを試してみてください。多分これはあなたの問題を解決することができます。テスト用にキーコードを入れます。おそらくタッチイベントも可能です。


1
monkeyrunnerのインストール方法を教えてください。adbはmonkeyrunnerを認識していません
インディラ

これは、adbのuiエクササイザーモンキーとは関係ありません。monkeyrunnerは、adtのリビジョン9のtoolsディレクトリにあります。
キーボード

また、私の回答内に提供したリンクも確認してください。これにより、モンキーランナーに関するGoogleの情報が提供されます。
キーボード

「./adb shell monkey」で試してみました。しかし、タッチイベントを呼び出すことができませんでした
インディラ12/10/13

異なるツールadb shell monkeyではありませんmonkeyrunner
キーボード

0

モンキースクリプトを使用しているときに、DispatchPress(KEYCODE_BACK)が実際には何も実行していないことに気付きました。多くの場合、これはアクティビティがキーイベントを消費しないためです。この問題の解決策は、猿のスクリプトとadbシェルの入力コマンドを組み合わせてシーケンスで使用することです。

1モンキースクリプトを使用すると、優れたタイミング制御が得られます。アクティビティを特定の秒数待機します。これはadb呼び出しをブロックしています。
2最後にadb shell input keyevent 4を送信すると、実行中のAPKが終了します。

例えば

adb shell monkey -p com.my.application -v -v -v -f /sdcard/monkey_script.txt 1
adb shell input keyevent 4


Stack Overflowへようこそ!回答を投稿していただきありがとうございます。セルフプロモーションに関するFAQをよくお読みください。また、独自のサイト/製品にリンクするたびに免責事項を投稿する必要があることにも注意してください。リンクを削除しました。同様に開示を追加せずに追加しないでください。
アンドリューバーバー

-6

MotionEventは、画面に触れるだけで生成されます。


10
MotionEventの静的取得メソッドの1つを使用して手動で作成できます。
azdev 2011
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.