Bagaimana cara mensimulasikan acara sentuh di Android?


101

Bagaimana cara mensimulasikan kejadian sentuh dengan Android sambil memberikan koordinat X dan Y secara manual?


1
Anda mendapatkan beberapa jawaban yang bisa diterapkan di bawah ini, harap diingat bahwa jawaban tersebut hanya akan berfungsi pada aplikasi yang dapat Anda modifikasi kecil. Untuk aplikasi lain yang tidak dapat Anda modifikasi, Anda memerlukan platform yang di-root untuk memasukkan peristiwa.
Chris Stratton

Apakah mungkin membuat aplikasi untuk menyentuh x, y pada setiap 10 detik dan memperkecilnya, tetapi menyentuh x, y tetap dilanjutkan?
Dr.jacky

Periksa jawaban saya tanpa persyaratan root. :)
Anand Varkey Philips

Jawaban:


110

Metode Valentin Rocher berfungsi jika Anda telah memperluas pandangan Anda, tetapi jika Anda menggunakan pendengar acara, gunakan ini:

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

Untuk lebih lanjut tentang mendapatkan objek MotionEvent, berikut ini jawaban yang sangat bagus: Android: Bagaimana cara membuat MotionEvent?


1
Jawaban yang bagus, tetapi sebagai pemula Android, OnTouchListener membuat saya bingung. Sekarang saya menyadari bahwa pendengar tidak perlu melakukan simulasi. Satu-satunya hal yang diperlukan adalah MotionEvent di paruh kedua kode Anda.
pengguna1532390

Mengapa Anda menambahkan 100 mili ke eventTime? Apakah tidak berfungsi jika downTime dan eventTime sama?
tu-Reinstate Monica-dor duh

2
@tudor - Hanya untuk mensimulasikan sentuhan nyata. downTimeakan menjadi waktu saat pengguna menyentuh layar, sedangkan eventTimedalam kasus ini adalah saat pengguna mengangkat jari ke atas ( ACTION_UP). Saya tidak yakin apakah itu akan tetap berfungsi jika keduanya sama. Anda dapat mengujinya dan memposting hasil Anda.
azdev

Bagaimana cara mendeklarasikan objek tampilan?
TheLogicGuy

ok .. bagaimana dengan gerakan swipe ke kiri, kanan, atas dan bawah .. menggunakan ACTION_MOVE bagaimana melakukan ini?
Ramesh_D

24

Berikut adalah skrip monkeyrunner yang mengirimkan sentuhan dan seret ke aplikasi. Saya telah menggunakan ini untuk menguji apakah aplikasi saya dapat menangani gerakan gesek berulang yang cepat.

# 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
Anda harus menggunakan MonkeyDevice.DOWN_AND_UPbukan 'DOWN_AND_UP'. ( DOWN_AND_UPadalah default, jadi kode Anda masih berfungsi)
ValarDohaeris

Mencoba di perangkat lain (Nexus 10), itu hanya reboot setelah UPtindakan
Equidamoid

Bisakah saya menggunakan ini di kelas non-pengujian?
Dania

20

gunakan Perintah adb Shell untuk mensimulasikan peristiwa sentuh

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
hei bagaimana jika ingin mensimulasikan pinch zoom menggunakan perintah adb dan saya memiliki koordinat pinch zoom
nikhil84

1

Jika saya mengerti dengan jelas, Anda ingin melakukan ini secara terprogram. Kemudian, Anda dapat menggunakan metode onTouchEventView , dan membuat MotionEventdengan koordinat yang Anda butuhkan.


1

Anda harus mencoba monkeyrunner baru . Mungkin ini bisa menyelesaikan masalah Anda. Anda meletakkan kode kunci di dalamnya untuk pengujian, mungkin peristiwa sentuh juga dimungkinkan.


1
Tolong beri tahu saya cara memasang monkeyrunner. adb tidak mengakui monkeyrunner
indira

Ini tidak terkait dengan monyet ui excersiser adb. Anda akan menemukan monkeyrunner di direktori alat revisi 9 adt.
keyboardsurfer

Lihat juga tautan yang saya berikan dalam jawaban saya. Ini mengarah ke informasi yang disediakan Google tentang monkeyrunner.
keyboardsurfer

Saya mencoba dengan "./adb shell monkey". Tapi tidak bisa meminta acara sentuh
indira

Bukan adb shell monkeyitu monkeyrunner, yang merupakan alat yang berbeda.
keyboardsurfer

0

Saat menggunakan Monkey Script saya perhatikan bahwa DispatchPress (KEYCODE_BACK) tidak melakukan apa pun yang benar-benar payah. Dalam banyak kasus, hal ini disebabkan oleh fakta bahwa Aktivitas tidak menggunakan event Key. Solusi untuk masalah ini adalah dengan menggunakan campuran perintah monkey script dan adb shell secara berurutan.

1 Menggunakan skrip monyet memberikan kontrol waktu yang bagus. Tunggu beberapa detik untuk aktivitas dan panggilan adb memblokir.
2 Akhirnya, mengirim adb shell input keyevent 4 akan mengakhiri APK yang berjalan.

MISALNYA

adb shell monkey -p com.my.application -v -v -v -f /sdcard/monkey_script.txt 1
kejadian kunci masukan shell adb 4


Selamat datang di Stack Overflow! Terima kasih telah memposting jawaban Anda! Harap pastikan untuk membaca FAQ tentang Promosi Mandiri dengan cermat. Perhatikan juga bahwa Anda diharuskan memposting disclaimer setiap kali Anda menautkan ke situs / produk Anda sendiri. Saya telah menghapus link tersebut. Jangan menambahkannya kembali tanpa menambahkan pengungkapan juga.
Andrew Barber

-6

MotionEvent dibuat hanya dengan menyentuh layar.


10
Anda dapat membuatnya secara manual menggunakan salah satu metode perolehan statis MotionEvent.
azdev
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.