2011-03-09 10 views
13

So come "sintetizzare" un MotionEvent:Come inviare MotionEvent sintetizzato attraverso il sistema?

event = MotionEvent.obtain(downTime, eventTime, MotionEvent.ACTION_DOWN, x, y, 0); 

Quello che sto bloccato a è come "invio/post/incendio/distribuire" attraverso il sistema, in modo che sia gestito "come se" un vero utente ha effettivamente toccato lo schermo con il dito.

È possibile?

Se sì, come posso realizzare questo?

+0

Puoi incollare il layout e la parte di codice in cui stai usando questo? pls ... – Markonato

risposta

4

No, è impedito dalla progettazione. La preoccupazione è che tale funzione possa essere utilizzata per sovvertire l'intero modello di sicurezza, ad es. "iniettando" tocchi per contattare il mercato, organizzare un'installazione, accettare le avvertenze di sicurezza .. tutto da solo.

Questo è stato discusso in una certa lunghezza here e seguenti.

Se questo risponde alla tua domanda, fai clic sul segno di spunta a sinistra - grazie!

+0

Se la tua risposta risulta corretta, allora non mi piace. :) Quello che dici ha senso, ma se hai familiarità con la classe InstrumentationTestCase penso che faccia ciò che sto cercando di realizzare. Ne sei completamente sicuro? È possibile almeno "falsificare" MotionEvents solo nella ** propria ** app/attività/vista? –

+1

@REG Se risulti essere quello che ha ragione, mi piacerà :) La disponibilità di InstrumentationTestCase, Monkey, ecc., In effetti, dimostra la capacità di iniettori di eventi "add-on". Quello che ho letto (mi dispiace, non ricordo ref come questo era mesi fa) è che gli eventi entrano nel sistema attraverso un cancello protetto da hardware. Se hai la chiave, puoi iniettare eventi. Gli strumenti apparentemente fanno uso di tasti speciali per l'uso in condizioni molto limitate. Non vedo l'ora di sentire qualcos'altro che potresti trovare ... – DJC

+0

Ti ho già dato un +1 per l'unico indizio fino ad ora che ho avuto questa sfida. Darò presto un altro +1 per chiarire ulteriormente questo problema nel tuo commento. Come ho detto nel mio commento, non sono molto interessato a iniettare un evento nel ** sistema **, sono solo interessato a svolgere un'attività di selezione del testo in una delle ** mie ** visualizzazioni. Vedi http://stackoverflow.com/questions/5250290/why-doesnt-this-motionevent-simulation-work Questo è possibile? –

17

cosa si sta cercando di fare è perfettamente possibile e semplice:

void simulateEventDown(View v, long x, long y) 
{ 
    MotionEvent e = MotionEvent.obtain(SystemClock.uptimeMillis(), 
             SystemClock.uptimeMillis(), 
             MotionEvent.ACTION_DOWN, 
             x, y, 0); 
    v.dispatchTouchEvent(e); 
} 
+0

Grazie! Questo è esattamente ciò di cui avevo bisogno per ottenere la tastiera virtuale giusta da aprire in una WebView. Devo simulare un clic nella casella di input. – Pre101

+0

@pryma tutte le azioni tranne ACION_MOVE vengono inviate senza proplem. action to ACTION_MOVE lancia sempre arrayindexoutofboundsexception su MotionEvent.getX(). Hai idea di cosa potrebbe accadere? –

+0

Sembra che se v è un 'ViewGroup' non invierà alcun evento oltre a quanto non sia' ViewGroup 'oggetto stesso (in altre parole, equivale a chiamare' dispatchTouchEvent' e 'onTouchEvent'). –

Problemi correlati