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.