Bagaimana cara mensimulasikan acara sentuh di Android?

101

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

indira
sumber
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?

azdev
sumber
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)
Warwick
sumber
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 
Arjun Prakash
sumber
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.

Valentin Rocher
sumber
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.

keyboardsurfer
sumber
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

Thomas J Younsi
sumber
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.

indira
sumber
10
Anda dapat membuatnya secara manual menggunakan salah satu metode perolehan statis MotionEvent.
azdev