How to simulate a touch event in Android?
Asked Answered
S

7

109

How to simulate a touch event with Android while giving the X and Y coordinates manually?

Schonthal answered 9/12, 2010 at 7:59 Comment(2)
You are getting some workable answers below, just bear in mind they will only work on applications to which you can make small modifications. For other apps you cannot modify, you would need a rooted platform to inject events.Leroy
Is it possible to make a application to touch in x,y on each 10 second and minimize it, but touching in x,y be continued?Leyba
A
114

Valentin Rocher's method works if you've extended your view, but if you're using an event listener, use this:

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);

For more on obtaining a MotionEvent object, here is an excellent answer: Android: How to create a MotionEvent?

Astereognosis answered 9/8, 2011 at 18:52 Comment(6)
Good answer, but as an Android beginner the OnTouchListener confused me. I now realize that the listener is not necessary to the simulation. The only thing that is necessary is the MotionEvent in the second half of your code.Anguished
Why are you adding 100 millis to the eventTime? Does it not work if downTime and eventTime are the same?Exhalant
@tudor - Only to simulate a real touch. downTime would be the time when the user touches down on the screen, while eventTime in this case would be when the user lifts their finger up (ACTION_UP). I am not sure if it will still work if both are the same. You could test it and post your results.Astereognosis
How should I declare the view object?Hibben
ok.. what about swipe gesture left, right, top and bottom.. using ACTION_MOVE how to do this ?Stull
@azdev that's not true about "simulating real touch". From docs: event time is the the time (in ms) when this specific event was generated. This must be obtained from uptimeMillis(). downTime is The time (in ms) when the user originally pressed down to start a stream of position events. This must be obtained from uptimeMillis()Ernaline
V
26

Here is a monkeyrunner script that sends touch and drags to an application. I have been using this to test that my application can handle rapid repetitive swipe gestures.

# 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)
Veratrine answered 19/1, 2011 at 0:13 Comment(3)
You should use MonkeyDevice.DOWN_AND_UP instead of 'DOWN_AND_UP'. (DOWN_AND_UP is the default, so your code still works)Fingerling
Tried on another device (Nexus 10), it simply reboots just after UP actionAxes
Can I use this in a non-testing class?Kex
U
23

use adb Shell Commands to simulate the touch event

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 
Unweave answered 12/3, 2014 at 12:39 Comment(1)
hey what about if want to simulate pinch zoom using adb command and I have coordinates of pinch zoomJimjimdandy
W
1

You should give the new monkeyrunner a go. Maybe this can solve your problems. You put keycodes in it for testing, maybe touch events are also possible.

Wrand answered 9/12, 2010 at 8:10 Comment(11)
Please let me know how to install monkeyrunner. adb is not recognizing monkeyrunnerSchonthal
It's not related to adb's ui excersiser monkey. You'll find monkeyrunner in the tools directory of revision 9 of the adt.Wrand
Also check out the link I have provided within my answer. This leads to Google's provided information on the monkeyrunner.Wrand
I tried with "./adb shell monkey". But couldn't invoke touch eventSchonthal
It is not adb shell monkey it is the monkeyrunner, which is a different tool.Wrand
There is a description of the general useage over here: developer.android.com/guide/developing/tools/… I didn't find the time to try it myself, but it sounds promising.Wrand
sorry.. monkeyrunner didn't work for me.. got "command not found".Schonthal
Are you sure, that you do have android sdk tools revision 8 installed? They provide the monkeyrunner. You will find it in the tools directory.Wrand
"grep -rn monkey * " only shows images/NOTICE.txt:80: /system/framework/monkey.jar images/NOTICE.txt:2527: /system/framework/monkey.jarSchonthal
You are sure that you did get the latest android utilities? Run android update sdk and install the latest sdk and tools. They also contain the monkeyrunnerWrand
Thank u very much.. :) Now I'm getting monkeyrunnerSchonthal
P
1

If I understand clearly, you want to do this programatically. Then, you could use the onTouchEvent method of View, and create a MotionEvent with the coordinates you need.

Persuade answered 9/12, 2010 at 8:11 Comment(0)
U
0

When using Monkey Script I noticed that DispatchPress(KEYCODE_BACK) is doing nothing which really suck. In many cases this is due to the fact that the Activity doesn't consume the Key event. The solution to this problem is to use a mix of monkey script and adb shell input command in a sequence.

1 Using monkey script gave some great timing control. Wait a certain amount of second for the activity and is a blocking adb call.
2 Finally sending adb shell input keyevent 4 will end the running APK.

EG

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

Uropod answered 25/1, 2013 at 4:25 Comment(1)
Welcome to Stack Overflow! Thanks for posting your answer! Please be sure to read the FAQ on Self-Promotion carefully. Also note that it is required that you post a disclaimer every time you link to your own site/product. I have removed the link. Do not add it back in without adding a disclosure as well.Chanellechaney
S
-7

MotionEvent is generated only by touching the screen.

Schonthal answered 10/12, 2010 at 4:18 Comment(1)
You can create one manually by using one of MotionEvent's static obtain methods.Astereognosis

© 2022 - 2024 — McMap. All rights reserved.