จะจำลองเหตุการณ์การสัมผัสใน Android ได้อย่างไร?


101

จะจำลองเหตุการณ์การสัมผัสด้วย Android ในขณะที่ให้พิกัด X และ Y ด้วยตนเองได้อย่างไร


1
คุณกำลังได้รับคำตอบที่ใช้การได้ด้านล่างโปรดจำไว้ว่าคำตอบเหล่านี้จะใช้ได้เฉพาะกับแอปพลิเคชันที่คุณสามารถปรับเปลี่ยนเล็กน้อยได้ สำหรับแอปอื่น ๆ ที่คุณไม่สามารถแก้ไขได้คุณจะต้องมีแพลตฟอร์มที่รูทเพื่อแทรกเหตุการณ์
Chris Stratton

เป็นไปได้ไหมที่จะสร้างแอปพลิเคชั่นให้แตะ x, y ในทุกๆ 10 วินาทีและย่อเล็กสุด แต่แตะใน 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

เหตุใดคุณจึงเพิ่ม 100 มิลลิวินาทีใน eventTime จะไม่ทำงานถ้า downTime และ eventTime เหมือนกัน?
tu-Reinstate Monica-dor duh

2
@tudor - เพื่อจำลองการสัมผัสจริงเท่านั้น downTimeจะเป็นเวลาที่ผู้ใช้แตะลงบนหน้าจอในขณะที่eventTimeในกรณีนี้จะเป็นเวลาที่ผู้ใช้ยกนิ้วขึ้น ( ACTION_UP) ฉันไม่แน่ใจว่ามันจะยังใช้งานได้หรือไม่ถ้าทั้งสองเหมือนกัน คุณสามารถทดสอบและโพสต์ผลลัพธ์ของคุณ
azdev

ฉันจะประกาศวัตถุมุมมองได้อย่างไร
TheLogicGuy

โอเค .. แล้วท่าทางการปัดไปทางซ้ายขวาบนและล่าง .. โดยใช้ 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

ลองกับอุปกรณ์อื่น (Nexus 10) มันจะรีบูตทันทีหลังจากUPดำเนินการ
Equidamoid

ฉันสามารถใช้สิ่งนี้ในคลาสที่ไม่ใช่การทดสอบได้หรือไม่
Dania

21

ใช้ adb Shell Commands เพื่อจำลองเหตุการณ์การสัมผัส

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

คุณควรให้Monkeyrunnerใหม่ไป บางทีนี่อาจช่วยแก้ปัญหาของคุณได้ คุณใส่รหัสเพื่อทดสอบอาจเป็นเหตุการณ์สัมผัสได้


1
โปรดแจ้งให้เราทราบวิธีการติดตั้ง monkeyrunner adb ไม่รู้จัก Monkeyrunner
อินทิรา

มันไม่เกี่ยวกับ ui excersiser monkey ของ adb คุณจะพบ Monkeyrunner ในไดเร็กทอรี tools ของการแก้ไข 9 ของ adt
คีย์บอร์ด

ตรวจสอบลิงก์ที่ฉันให้ไว้ในคำตอบของฉัน สิ่งนี้นำไปสู่ข้อมูลที่ Google ให้ไว้เกี่ยวกับ Monkeyrunner
คีย์บอร์ด

ฉันลองใช้ "./adb shell monkey" แต่ไม่สามารถเรียกเหตุการณ์สัมผัสได้
indira

ไม่ใช่adb shell monkeyมันเป็นmonkeyrunnerเครื่องมือที่แตกต่างกัน
คีย์บอร์ด

0

เมื่อใช้ Monkey Script ฉันสังเกตว่า DispatchPress (KEYCODE_BACK) ไม่ได้ทำอะไรเลยที่แย่มาก ในหลาย ๆ กรณีเกิดจากการที่กิจกรรมไม่ใช้เหตุการณ์สำคัญ วิธีแก้ปัญหานี้คือการใช้คำสั่งผสมของ Monkey script และ adb shell input ตามลำดับ

1 การใช้สคริปต์ลิงช่วยให้สามารถควบคุมเวลาได้ดีเยี่ยม รอสักครู่สำหรับกิจกรรมและเป็นการปิดกั้นการโทร adb
2 ในที่สุดก็ส่งคีย์อินพุตเชลล์ adb เหตุการณ์ 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! ขอบคุณสำหรับการโพสต์คำตอบของคุณ! โปรดอ่านคำถามที่พบบ่อยเกี่ยวกับการส่งเสริมตนเองอย่างละเอียด โปรดทราบว่าคุณจำเป็นต้องโพสต์ข้อจำกัดความรับผิดชอบทุกครั้งที่คุณเชื่อมโยงไปยังไซต์ / ผลิตภัณฑ์ของคุณเอง ฉันได้ลบลิงค์ออก อย่าเพิ่มกลับเข้าไปโดยไม่เพิ่มการเปิดเผยข้อมูลด้วย
Andrew Barber

-6

MotionEvent สร้างขึ้นโดยการสัมผัสหน้าจอเท่านั้น


10
คุณสามารถสร้างได้ด้วยตนเองโดยใช้วิธีการรับแบบคงที่ของ MotionEvent
azdev
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.