2012-01-02 19 views
16

Come posso simulare a livello di codice una pressione di un tasto su un Droid? Mi piacerebbe imitare una pressione manuale dei tasti (appare sul droide che qualcuno sta premendo un tasto ma viene fatto a livello di programmazione).Android simula la pressione di una chiave

Ci sono soluzioni là fuori che coinvolgono IWindowManager, ma questa non è più un'opzione nel nuovo SDK.

+0

La strumentazione di prova, modificando l'applicazione per rispondere a qualcosa di diverso Tocchi reali e "rooting" del dispositivo per iniettare eventi a livello di Linux sono le tue 3 scelte. –

risposta

32

È possibile utilizzare la strumentazione, per esempio seguente codice chiamato dal onCreate della vostra attività causerà menu per essere aperto e chiuso più volte:

new Thread(new Runnable() {   
     @Override 
     public void run() { 
      try { 
      Instrumentation inst = new Instrumentation(); 
      for (int i = 0; i < 10; ++i) { 
       inst.sendKeyDownUpSync(KeyEvent.KEYCODE_MENU); 
       Thread.sleep(2000); 
       inst.sendKeyDownUpSync(KeyEvent.KEYCODE_BACK); 
       Thread.sleep(2000); 
      } 
      } 
      catch(InterruptedException e){ 
      } 
     } 
    }).start(); 

... ma non sono sicuro se questo è ciò che sei dopo

+4

questo è esattamente quello che sto cercando, ma ... non è strettamente strumentale per i test? Sto cercando una soluzione che possa essere utilizzata in un'app live, non testata. Grazie in anticipo. – calcrisk33

+0

@ calcrisk33 Non sono stato in grado di trovare alcuna informazione sul fatto che questa sia una soluzione valida per un'app live. Hai finito per usarlo in quel modo? – Kirk

+1

@Kirk ho fatto e ha funzionato molto bene per simulare un colpo di chiave/stampa. – calcrisk33

0

Se si dispone di una vista che si desidera consumare l'evento è possibile utilizzare la classe BaseInputConnection e il relativo metodo sendKeyEvent.

Per utilizzarlo è necessario specificare una vista di destinazione (ad esempio un EditText) che riceverà KeyEvent. Per esempio:

EditText editText; 
BaseInputConnection inputConnection = new BaseInputConnection(editText, true); 
inputConnection.sendKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_POUND)); 

Il risultato di questo è come utente sarebbe in realtà premuto il tasto # (pur avendo il testo di modifica concentrato).

0

È inoltre possibile utilizzare input text, vale a dire:

Da computer tramite adb:

adb shell input text 'example\\@email.com' 

Da shell:

input text 'example\\@email.com'