2014-07-08 1 views
5

che voglio realizzare seguente:onTouchEvent da codice tramite Strumentazione

I have two buttons. When first button is pressed, 
it will fire onTouchEvent on second button, thus pressing second button. 

Ecco l'estratto di codice che genera evento:

int test1[] = new int[2]; 
button2.getLocationInWindow(test1); //--->getting coordinates of second button 
Instrumentation m_Instrumentation = new Instrumentation(); 
//firing event 
m_Instrumentation.sendPointerSync(MotionEvent.obtain(android.os.SystemClock.uptimeMillis(),android.os.SystemClock.uptimeMillis(),MotionEvent.ACTION_DOWN,test1[0]+10, test1[1]+10, 0)); 

Nota: Io uso genymotion emulatore.

Log degli errori:

07-08 12:47:38.743: E/InputEventReceiver(6849): Exception dispatching input event. 
07-08 12:47:38.743: E/MessageQueue-JNI(6849): Exception in MessageQueue callback: handleReceiveCallback 
07-08 12:47:38.743: E/MessageQueue-JNI(6849): java.lang.RuntimeException: This method can not be called from the main application thread 
07-08 12:47:38.743: E/MessageQueue-JNI(6849): at android.app.Instrumentation.validateNotAppThread(Instrumentation.java:1651) 
07-08 12:47:38.743: E/MessageQueue-JNI(6849): at android.app.Instrumentation.sendPointerSync(Instrumentation.java:933) 
07-08 12:47:38.743: E/MessageQueue-JNI(6849): at com.example.touchtest1.MainActivity.fireEvent(MainActivity.java:55) 
07-08 12:47:38.743: E/MessageQueue-JNI(6849): at com.example.touchtest1.MainActivity$MyTouchListener.onTouch(MainActivity.java:75) 
07-08 12:47:38.743: E/MessageQueue-JNI(6849): at android.view.View.dispatchTouchEvent(View.java:7701) 
07-08 12:47:38.743: E/MessageQueue-JNI(6849): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216) 
07-08 12:47:38.743: E/MessageQueue-JNI(6849): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917) 
07-08 12:47:38.743: E/MessageQueue-JNI(6849): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216) 
07-08 12:47:38.743: E/MessageQueue-JNI(6849): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917) 
07-08 12:47:38.743: E/MessageQueue-JNI(6849): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216) 
07-08 12:47:38.743: E/MessageQueue-JNI(6849): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917) 
07-08 12:47:38.743: E/MessageQueue-JNI(6849): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216) 
07-08 12:47:38.743: E/MessageQueue-JNI(6849): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917) 
07-08 12:47:38.743: E/MessageQueue-JNI(6849): at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2068) 
07-08 12:47:38.743: E/MessageQueue-JNI(6849): at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1515) 
07-08 12:47:38.743: E/MessageQueue-JNI(6849): at android.app.Activity.dispatchTouchEvent(Activity.java:2458) 
07-08 12:47:38.743: E/MessageQueue-JNI(6849): at android.support.v7.app.ActionBarActivityDelegateICS$WindowCallbackWrapper.dispatchTouchEvent(ActionBarActivityDelegateICS.java:260) 
07-08 12:47:38.743: E/MessageQueue-JNI(6849): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2016) 
07-08 12:47:38.743: E/MessageQueue-JNI(6849): at android.view.View.dispatchPointerEvent(View.java:7886) 
07-08 12:47:38.743: E/MessageQueue-JNI(6849): at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:3954) 
07-08 12:47:38.743: E/MessageQueue-JNI(6849): at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3833) 

Tuttavia, non sta andando come previsto. Dove può essere un problema?

Per quanto riguarda

+0

Cosa significa "non andare come previsto"? Cosa sta realmente accadendo quando provi questo? –

+0

@AndrewSchuster, dà errori. – nurgasemetey

+1

Ora aggiornerò con il log degli errori – nurgasemetey

risposta

1

base all'errore e the excerpt at the bottom of this documentation, sembra che non è possibile eseguire questo sul thread principale (in altre parole, il thread UI).

Una possibile soluzione sarebbe quella di eseguirlo in un altro thread. Si sarebbe simile a questa:

int test1[] = new int[2]; 
button2.getLocationInWindow(test1); //--->getting coordinates of second button 
final Instrumentation m_Instrumentation = new Instrumentation(); 
//firing event 

new Thread(new Runnable() { 
    @Override 
    public void run() { 
     m_Instrumentation.sendPointerSync(MotionEvent.obtain(
       android.os.SystemClock.uptimeMillis(), 
       android.os.SystemClock.uptimeMillis(), 
       MotionEvent.ACTION_DOWN,test1[0]+10, test1[1]+10, 0)); 
    } 
}).start(); 

Nota che ho cambiato il vostro m_Instrumentation a una variabile final in modo che potesse essere utilizzato in un thread diverso.

+0

Andrew Schuster, sei fantastico! Ha funzionato :) – nurgasemetey

0

La strumentazione non funziona sul thread principale (UI).

Si può provare a implementare una classe AsyncTask che può fare il lavoro per voi in background. Dopo l'implementazione, tutto ciò che serve è chiamarlo da un metodo della classe;

private void CREATE_EVENT() 
{ 
    long action_time = SystemClock.uptimeMillis(); 

    //MotionEvent.obtain(long downTime, long eventTime, int action, float x, float y, int metaState); 
    MotionEvent motion_event = MotionEvent.obtain(action_time, action_time, MotionEvent.ACTION_DOWN, 250, 150, 0); 

    new INJECT_EVENTS().execute(motion_event); 
    } 

public class INJECT_EVENTS extends AsyncTask<MotionEvent, MotionEvent, MotionEvent> 
{ 
    @Override 
    protected MotionEvent doInBackground(MotionEvent ... event) { 

     Instrumentation inject_event = new Instrumentation(); 
     event[0].recycle(); 
     inject_event.sendPointerSync(event[0]); 
     Log.i("TEST", event[0].toString() + " __________________________EVENT CREATED!"); 
     return null; 
    } 
}