एंड्रॉइड में एक टच इवेंट कैसे अनुकरण करें?


101

मैन्युअल रूप से एक्स और वाई निर्देशांक देते समय एंड्रॉइड के साथ एक स्पर्श घटना का अनुकरण कैसे करें?


1
आपको नीचे कुछ व्यावहारिक जवाब मिल रहे हैं, बस ध्यान रखें कि वे केवल उन अनुप्रयोगों पर काम करेंगे जिनके लिए आप छोटे संशोधन कर सकते हैं। अन्य ऐप्स के लिए जिन्हें आप संशोधित नहीं कर सकते हैं, आपको घटनाओं को इंजेक्ट करने के लिए एक रूट किए गए प्लेटफ़ॉर्म की आवश्यकता होगी।
क्रिस स्ट्रैटन

क्या प्रत्येक 10 सेकंड पर x, y में स्पर्श करने और इसे कम करने के लिए एक आवेदन करना संभव है, लेकिन x, y में स्पर्श करना जारी रखा जाना चाहिए?
डॉ। अंजेकी

कोई मूल आवश्यकताओं के साथ मेरे जवाब की जाँच करें। :)
आनंद वर्की फिलिप्स

जवाबों:


110

यदि आपने अपना विचार बढ़ा दिया है, तो वैलेंटाइन रोचर का तरीका काम करता है, लेकिन यदि आप एक इवेंट श्रोता का उपयोग कर रहे हैं, तो इसका उपयोग करें:

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 मिली को क्यों जोड़ रहे हैं? अगर डाउनटाइम और इवेंटटाइम एक ही हैं तो क्या यह काम नहीं करता है?
टू-रिइंस्टेट मोनिका-डोर डुह

2
@tudor - केवल एक वास्तविक स्पर्श का अनुकरण करने के लिए। downTimeवह समय होगा जब उपयोगकर्ता स्क्रीन पर टच करेगा, जबकि eventTimeइस मामले में होगा जब उपयोगकर्ता अपनी उंगली उठाता है ( ACTION_UP)। मुझे यकीन नहीं है कि अगर दोनों समान हैं तो भी यह काम करेगा। आप इसका परीक्षण कर सकते हैं और अपने परिणाम पोस्ट कर सकते हैं।
अजदेव dev

मुझे दृश्य वस्तु कैसे घोषित करनी चाहिए?
TheLogicGuy

ठीक है .. क्या स्वाइप जेस्चर के बारे में बाएं, दाएं, ऊपर और नीचे .. ACTION_MOVE का उपयोग कैसे करें?
रमेश_ड

24

यहाँ एक मंकी स्क्रिप्ट है जो एक एप्लीकेशन को टच और ड्रग्स भेजता है। मैं यह परीक्षण करने के लिए उपयोग कर रहा हूं कि मेरा आवेदन तेजी से दोहराए जाने वाले स्वाइप इशारों को संभाल सकता है।

# 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डिफ़ॉल्ट है, इसलिए आपका कोड अभी भी काम करता है)
वलारोहैरिस

एक अन्य डिवाइस (नेक्सस 10) पर कोशिश की, यह बस UPकार्रवाई के बाद रिबूट करता है
इक्विडेमॉइड

क्या मैं एक गैर-परीक्षण वर्ग में इसका उपयोग कर सकता हूं?
दनिया

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 कमांड का उपयोग करके चुटकी ज़ूम को अनुकरण करना चाहते हैं और मेरे पास चुटकी ज़ूम के निर्देशांक हैं
nikhil84

1

यदि मैं स्पष्ट रूप से समझता हूं, तो आप इस कार्यक्रम को करना चाहते हैं। उसके बाद, आप अपनी आवश्यकता के निर्देशांक के साथ onTouchEvent विधि का उपयोग कर सकते हैं Viewऔर बना MotionEventसकते हैं।


1

आपको नए बंदर को एक जाना चाहिए। हो सकता है कि यह आपकी समस्याओं को हल कर सकता है। आप इसमें टेस्टिंग के लिए कीकोड लगाते हैं, हो सकता है कि टच इवेंट भी संभव हो।


1
कृपया मुझे पता है कि मंकीरनर कैसे स्थापित करें। adb बंदरों को नहीं पहचान रहा है
indira

यह adb के ui excersiser बंदर से संबंधित नहीं है। आपको adt के संशोधन 9 के उपकरण निर्देशिका में मंकीरनर मिलेंगे।
बोर्ड

अपने उत्तर के भीतर मेरे द्वारा दिए गए लिंक को भी देखें। इससे Google को बंदरों पर जानकारी प्रदान की जाती है।
कीबोर्डबोर्डर

मैंने "./adb शेल मंकी" के साथ प्रयास किया। लेकिन टच इवेंट
इंदिरा डेके

यह ऐसा नहीं adb shell monkeyहै monkeyrunner, जो कि एक अलग उपकरण है।
कीबोर्डबोर्ड

0

बंदर स्क्रिप्ट का उपयोग करते समय मैंने देखा कि डिस्पैचप्रेस (KEYCODE_BACK) कुछ भी नहीं कर रहा है जो वास्तव में चूसना है। कई मामलों में यह इस तथ्य के कारण है कि गतिविधि कुंजी घटना का उपभोग नहीं करती है। इस समस्या का हल एक क्रम में बंदर स्क्रिप्ट और एडीबी शेल इनपुट कमांड के मिश्रण का उपयोग करना है।

1 बंदर स्क्रिप्ट का उपयोग करते हुए कुछ महान समय पर नियंत्रण दिया गया। गतिविधि के लिए एक निश्चित मात्रा में दूसरी प्रतीक्षा करें और एक अवरोधी अदब कॉल है।
2 अंत में एडीबी शेल इनपुट कीवेंट 4 भेजने से एपीके चालू हो जाएगा।

ईजी

adb शेल बंदर -p com.my.application -v -v -v -f /sdcard/monkey_script.txt 1
adb शेल इनपुट कीवेंट 4


ढेर अतिप्रवाह में आपका स्वागत है! अपना उत्तर पोस्ट करने के लिए धन्यवाद! कृपया सेल्फ-प्रमोशन पर अक्सर पूछे जाने वाले प्रश्नों को ध्यान से पढ़ें । यह भी ध्यान दें कि यह आवश्यक है कि आप अपनी साइट / उत्पाद से लिंक करने पर हर बार एक अस्वीकरण पोस्ट करें। मैंने लिंक हटा दिया है। बिना प्रकटीकरण को जोड़े बिना इसे वापस न जोड़ें।
एंड्रयू बार्बर

-6

मोशनईवेंट केवल स्क्रीन को छूने से उत्पन्न होता है।


10
आप MotionEvent की स्थिर प्राप्त विधियों में से एक का उपयोग करके मैन्युअल रूप से एक बना सकते हैं।
18
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.