2012-10-23 7 views
5

Sto eseguendo il macking di una barra di navigazione personalizzata su Android 4.0.3.r1 e desidero inviare eventi chiave come "Home" e "Indietro". La mia domanda non è un sistema di conseguenza:Come posso inviare eventi chiave in Android?

IWindowManager mWindowManager = IWindowManager.Stub.asInterface(
       ServiceManager.getService(Context.WINDOW_SERVICE)); 
mWindowManager.injectKeyEvent(ev, false); 

Non funziona, perché non riesco a ottenere android.permission.INJECT_EVENTS da non applicazione di sistema. Come posso fare questo?

+2

Qualcuno modificato la mia domanda da "Come posso inviare gli eventi chiave in Android?" a "Come posso gestire gli eventi chiave in Android?" Quindi voglio sapere come posso ** inviare ** evento chiave. –

risposta

0

C'è anche la funzione sendKeyEventInputConnection. InputConnection è di livello solo API 3.

3
BaseInputConnection mInputConnection = new BaseInputConnection(targetView, true); 
mInputConnection.sendKeyEvent(new KeyEvent(...)); 
+0

Ehi, che cosa sarà in questo caso il targetView e come estrarlo se l'utente è su homescreen. Grazie – user2430771

+0

cosa è 'targerView'? ... –

+0

@ th3pat3l Immagino che sia la vista di destinazione ... – Virus721

-1

Funziona per me:

public static void simulateKey(final int KeyCode) { 

    new Thread() { 
     @Override 
     public void run() { 
      try { 
       Instrumentation inst = new Instrumentation(); 
       inst.sendKeyDownUpSync(KeyCode); 
      } catch (Exception e) { 
       Log.e("Exception when sendKeyDownUpSync", e.toString()); 
      } 
     } 

    }.start(); 
} 
+1

Wnen Io uso questi metodi mi dà errore sul permesso INJECT_EVENTS. Quindi seguo questo post: http://stackoverflow.com/questions/5383401/android-inject-events-permission?rq=1. Quando includo l'autorizzazione android.permission.INJECT_EVENTS nel file manifest, viene generato un errore in base al quale viene concessa l'autorizzazione alle app di sistema. Come posso includere questa autorizzazione?Grazie – user2430771

2

si può provare questo

try 
{ 
    String keyCommand = "input keyevent " + KeyEvent.KEYCODE_MENU; 
    Runtime runtime = Runtime.getRuntime(); 
    Process proc = runtime.exec(keyCommand); 
} 
catch (IOException e) 
{ 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 

naturalmente, è possibile scegliere il comando input text ... per l'immissione di un testo.

+0

Ciao, ho provato ad usarlo per implementare il mio pulsante Indietro ma non ha funzionato. Sto costruendo per Android 4.4.3. Ho cercato molto per una settimana ma finora non ho avuto successo. Grazie a – user2430771

+2

se si utilizza questo metodo, è necessario ottenere il privilegio di root – Huiyu

+1

Questo richiede un problema con root come Runtime.getRuntime(). Exec (new String [] {"su", "-c", "input keyevent" + KeyEvent. CHIAVE }); – UdayaLakmal

0

Rilanciare thread vecchio - È possibile eseguire a casa e tornare con la relativamente nuova API di accessibilità - check out "performGlobalAction" qui: http://developer.android.com/reference/android/accessibilityservice/AccessibilityService.html

(in particolare con la GLOBAL_ACTION_HOME e GLOBAL_ACTION_BACK azioni)

Naturalmente avrà bisogno di autorizzazioni appropriate per un servizio di accessibilità, ma questo non richiede root

+0

Non voglio ascoltare gli eventi, voglio inviare un evento (tasto indietro), come farlo nel codice usando AccessibilityService? –

0

Puoi provare questo.

long now = SystemClock.uptimeMillis(); 
BaseInputConnection mInputConnection = new BaseInputConnection(findViewById(R.id.MainActivity), true); 
KeyEvent down = new KeyEvent(now, now, KeyEvent.ACTION_DOWN,KeyEvent.KEYCODE_HOME, 0); 
mInputConnection.sendKeyEvent(down); 

Questo codice può funzionare per me.

Nota: Ricordarsi di sostituire "R.id.MainActivity" con il nome dell'attività.

0

Nessuno di questi è valido. Per andare alla schermata Home da utilizzare sotto il codice.

Intent home = new Intent(Intent.ACTION_MAIN); 
home.addCategory(Intent.CATEGORY_HOME); 
//home.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
startActivity(home); 

Se non si sta chiamando da attività/frammento potrebbe essere necessario decommentare la parte di bandiera. Per tornare al di sotto del codice funziona su alcuni dispositivi.

dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_BACK)); 
dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_BACK)); 

Fatemi sapere se questo aiuta!

1

Ecco alcuni precisione per Roman risposta

BaseInputConnection mInputConnection = new BaseInputConnection(findViewById(R.id.main_content), true); 
KeyEvent kd = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MENU); 
KeyEvent ku = new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_MENU); 
mInputConnection.sendKeyEvent(kd); 
mInputConnection.sendKeyEvent(ku);