Simulating Touch Events on Android

Simulating Touch Events on Android

30 November 2024 Stephan Petzl Leave a comment Tech-Help

Simulating touch events on Android devices can be a powerful tool for developers, especially when testing applications that require user interaction. This guide provides a comprehensive approach to simulate touch events by manually specifying X and Y coordinates. We’ll explore different methods to achieve this, offering practical examples to help you choose the best solution for your needs.

Using MotionEvent in Android

If you’re working with views in Android and need to simulate touch events programmatically, the MotionEvent class is an essential tool. This approach is particularly useful if you’ve extended your view or if you’re using an event listener. Below is a method to create and dispatch a touch event using MotionEvent:


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;
int metaState = 0;
MotionEvent motionEvent = MotionEvent.obtain(
    downTime, 
    eventTime, 
    MotionEvent.ACTION_UP, 
    x, 
    y, 
    metaState
);

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

Simulating Touch Events with ADB Commands

Another effective way to simulate touch events is by using Android Debug Bridge (ADB) shell commands. This method is straightforward and does not require modifying the application code:


adb shell input tap x y
  

For more advanced control, you can use the sendevent command to simulate low-level touch events:


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

For further reading, check our article on granting app permissions using ADB without root.

MonkeyRunner for Automated Testing

If you’re looking for a solution that involves automated testing, MonkeyRunner is a robust option. It allows you to script a sequence of touch and swipe actions, which can be particularly useful for stress testing your application:


from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice

device = MonkeyRunner.waitForConnection()
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):
    if i % 9 == 0:
        device.touch(x2, y, 'DOWN_AND_UP')
        MonkeyRunner.sleep(pause)
    device.drag(start, end, duration, steps)
    MonkeyRunner.sleep(pause)
    device.drag(end, start, duration, steps)
    MonkeyRunner.sleep(pause)
  

Enhancing Testing with Repeato

For developers seeking a streamlined approach to test automation, our product Repeato offers a no-code solution that integrates seamlessly with Android and iOS applications. Repeato leverages computer vision and AI, making it incredibly fast to edit and run tests. Additionally, with ADB on board, Repeato allows precise timing and sequencing of ADB commands through script steps, enhancing your automated testing capabilities.

Explore more on how Repeato can simplify your testing process by visiting our Android testing tool page.

Like this article? there’s more where that came from!