Android에서 터치 이벤트를 시뮬레이션하는 방법은 무엇입니까?


101

X 및 Y 좌표를 수동으로 제공하면서 Android로 터치 이벤트를 시뮬레이션하는 방법은 무엇입니까?


1
아래에서 몇 가지 실행 가능한 답변을 얻고 있습니다. 약간의 수정이 가능한 응용 프로그램에서만 작동한다는 점을 명심하십시오. 수정할 수없는 다른 앱의 경우 이벤트를 삽입하려면 루팅 된 플랫폼이 필요합니다.
Chris Stratton

10 초마다 x, y를 터치하고 최소화하는 응용 프로그램을 만들 수 있지만 x, y를 계속 터치하는 것이 가능합니까?
Dr.jacky

루트 요구 사항없이 내 대답을 확인하십시오. :)
Anand Varkey Philips

답변:


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

eventTime에 100 밀리를 추가하는 이유는 무엇입니까? downTime과 eventTime이 동일하면 작동하지 않습니까?
tu-Reinstate Monica-dor duh

2
@tudor-실제 터치를 시뮬레이션하기 위해서만 사용됩니다. downTime사용자가 화면을 터치하는 시간이고 eventTime,이 경우 사용자가 손가락을 들어 올릴 때 ( ACTION_UP)입니다. 둘 다 동일해도 여전히 작동하는지 확실하지 않습니다. 그것을 테스트하고 결과를 게시 할 수 있습니다.
azdev 2010 년

뷰 객체를 어떻게 선언해야합니까?
TheLogicGuy

ok .. 왼쪽, 오른쪽, 위쪽 및 아래쪽 스 와이프 제스처는 어떻습니까? ACTION_MOVE 사용 방법은?
Ramesh_D

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

다른 장치 (넥서스 10)에 시도, 그것은 단순히 한 후 재부팅 UP액션
Equidamoid

비 테스트 수업에서 이것을 사용할 수 있습니까?
Dania

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 명령을 사용하여 핀치 줌을 시뮬레이트하고 핀치 줌 좌표를 가지고
있다면 어떨까요

1

내가 명확하게 이해한다면 프로그래밍 방식으로 수행하고 싶습니다. 그런 다음의 onTouchEvent 메서드를 사용하고 필요한 좌표로를 View만들 MotionEvent수 있습니다.


1

당신은 새로운 몽키 러너 에게 가야합니다. 아마도 이것은 당신의 문제를 해결할 수 있습니다. 테스트를 위해 키 코드를 입력하면 터치 이벤트도 가능할 수 있습니다.


1
monkeyrunner 설치 방법을 알려주세요. ADB는 monkeyrunner 인식하지 못합니다
인디 라에게

adb의 ui excersiser monkey와 관련이 없습니다. adt의 버전 9의 도구 디렉토리에서 monkeyrunner를 찾을 수 있습니다.
keyboardsurfer

또한 내 답변에 제공 한 링크를 확인하십시오. 이것은 monkeyrunner에 대한 Google의 제공 정보로 이어집니다.
keyboardsurfer

"./adb shell monkey"로 시도했습니다. 그러나 터치 이벤트 호출 할 수
인디 라

그것은하지 않습니다 adb shell monkey그것은이다 monkeyrunner다른 도구이다.
keyboardsurfer

0

Monkey Script를 사용할 때 DispatchPress (KEYCODE_BACK)가 정말 짜증나는 일이 없다는 것을 알았습니다. 대부분의 경우 이는 활동이 Key 이벤트를 사용하지 않기 때문입니다. 이 문제에 대한 해결책은 monkey 스크립트와 adb shell 입력 명령을 순서대로 혼합하여 사용하는 것입니다.

1 원숭이 스크립트를 사용하면 훌륭한 타이밍 제어가 가능합니다. 활동을 위해 일정 시간을 기다렸다가 adb 호출을 차단합니다.
2 마지막으로 adb shell input keyevent 4를 보내면 실행중인 APK가 종료됩니다.

EG

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


Stack Overflow에 오신 것을 환영합니다! 답변을 게시 해 주셔서 감사합니다! Self-Promotion에 대한 FAQ를 주의 깊게 읽어 보시기 바랍니다 . 또한 자신의 사이트 / 제품에 연결할 때마다 면책 조항을 게시 해야 합니다. 링크를 제거했습니다. 공시를 추가하지 않고 다시 추가하지 마십시오.
Andrew Barber

-6

MotionEvent는 화면을 터치해야만 생성됩니다.


10
MotionEvent의 정적 획득 방법 중 하나를 사용하여 수동으로 생성 할 수 있습니다.
azdev
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.