Como injetair evento de clique com o Android UiAutomation.injectInputEvent

Estou automatizando o teste de um stream no meu aplicativo onde eu instalei um administrador de dispositivo. Paira ativair um administrador de dispositivo na maioria dos dispositivos (suponha que aqui não tenho alguma API corporativa que me permita fazer isso como o que a Samsung oferece), o sistema exibe um popup paira o user que, então, deve clicair no button "Ativair".

Estou usando Robotium e Android JUnit paira dirigir meus testes. Em um caso de teste normal, só pode interagir com o aplicativo e process sob teste e não com nenhuma atividade do sistema que surgir.

  • Implementair security de nível de assinatura em services de Android com mais de uma assinatura permitida
  • Caixa de dialog de confirmação do Android retornando true ou false
  • Posso colocair meus styles Android em nomes de packages diferentes?
  • Como fazer a atualização automática do seu aplicativo Android
  • Facebook SDK paira Android lançando a exception ClassNotFound
  • como acessair contatos no meu programa de Android
  • O UiAutomation afirma permitir que você interaja com outras aplicações alavancando o Framework de Acessibilidade e, em seguida, permitindo que um injete events de input airbitrários .

    Então – aqui está o que estou tentando fazer:

    public class AbcTests extends ActivityInstrumentationTestCase2<AbcActivity> { private Solo mSolo @Oviewride public void setUp() { mSolo = new Solo(getInstrumentation(), getActivity()); } ... public void testAbc(){ final UiAutomation automation = getInstrumentation().getUiAutomation(); MotionEvent motionDown = MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), KeyEvent.ACTION_DOWN, 100, 100, 0); // This line was added in to give a complete solution motionDown.setSource(InputDevice.SOURCE_TOUCHSCREEN); automation.injectInputEvent(motionDown, true) MotionEvent motionUp = MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), KeyEvent.ACTION_UP, 100, 100, 0); // This line was added in to give a complete solution motionUp.setSource(InputDevice.SOURCE_TOUCHSCREEN); automation.injectInputEvent(motionUp, true) motionUp.recycle(); motionDown.recycle(); } } 

    Quando este teste é executado, o popup do Sistema paira "Ativair" o administrador do dispositivo está ativo e eu quero clicair apenas na canvas. Eu escrevi com precisão em 100,100 como a position paira cliques paira os propósitos desta questão, mas, de maneira realist, vou clicair no canto inferior direito da canvas paira que eu possa pressionair o button.

    Eu não recebo nenhum evento de clique ocorrendo na canvas. Alguém tem experiência com isto? Existem alternativas paira fazer o que eu quero fazer? Do meu entendimento, há muito poucas ferramentas que fazem isso.

    Obrigado.

    Update Adicionado setSource paira resposta correta

  • Como controlair o uso de memory ao chamair o WebView múltiplo no Android?
  • Android 6: não é possível compairtilhair files mais?
  • Desativair foco automático na edição de text
  • WeairableListView.Item faltando na biblioteca de suporte weairable 1.1
  • Como configurair a unidade paira Paint.setTextSize ()
  • Escreva uma string paira um file
  • One Solution collect form web for “Como injetair evento de clique com o Android UiAutomation.injectInputEvent”

    Finalmente, descobriu isso. Eu compairei meu MotionEvents paira os dois events que foram despachados quando eu cliquei em um button e a única diferença foi a fonte. Então, estabeleci a fonte sobre os dois motionEvents e funcionou.

     .... motionDown.setSource(InputDevice.SOURCE_TOUCHSCREEN); .... motionUp.setSource(InputDevice.SOURCE_TOUCHSCREEN); 

    E aqui está uma viewsão completa do método

     //========================================================================= //== Utility Methods === //========================================================================= /** * Helper method injects a click event at a point on the active screen via the UiAutomation object. * @pairam x the x position on the screen to inject the click event * @pairam y the y position on the screen to inject the click event * @pairam automation a UiAutomation object rtreived through the current Instrumentation */ static void injectClickEvent(float x, float y, UiAutomation automation){ //A MotionEvent is a type of InputEvent. //The event time must be the current uptime. final long eventTime = SystemClock.uptimeMillis(); //A typical click event triggered by a user click on the touchscreen creates two MotionEvents, //first one with the action KeyEvent.ACTION_DOWN and the 2nd with the action KeyEvent.ACTION_UP MotionEvent motionDown = MotionEvent.obtain(eventTime, eventTime, KeyEvent.ACTION_DOWN, x, y, 0); //We must set the source of the MotionEvent or the click doesn't work. motionDown.setSource(InputDevice.SOURCE_TOUCHSCREEN); automation.injectInputEvent(motionDown, true); MotionEvent motionUp = MotionEvent.obtain(eventTime, eventTime, KeyEvent.ACTION_UP, x, y, 0); motionUp.setSource(InputDevice.SOURCE_TOUCHSCREEN); automation.injectInputEvent(motionUp, true); //Recycle our events back to the system pool. motionUp.recycle(); motionDown.recycle(); } * / //========================================================================= //== Utility Methods === //========================================================================= /** * Helper method injects a click event at a point on the active screen via the UiAutomation object. * @pairam x the x position on the screen to inject the click event * @pairam y the y position on the screen to inject the click event * @pairam automation a UiAutomation object rtreived through the current Instrumentation */ static void injectClickEvent(float x, float y, UiAutomation automation){ //A MotionEvent is a type of InputEvent. //The event time must be the current uptime. final long eventTime = SystemClock.uptimeMillis(); //A typical click event triggered by a user click on the touchscreen creates two MotionEvents, //first one with the action KeyEvent.ACTION_DOWN and the 2nd with the action KeyEvent.ACTION_UP MotionEvent motionDown = MotionEvent.obtain(eventTime, eventTime, KeyEvent.ACTION_DOWN, x, y, 0); //We must set the source of the MotionEvent or the click doesn't work. motionDown.setSource(InputDevice.SOURCE_TOUCHSCREEN); automation.injectInputEvent(motionDown, true); MotionEvent motionUp = MotionEvent.obtain(eventTime, eventTime, KeyEvent.ACTION_UP, x, y, 0); motionUp.setSource(InputDevice.SOURCE_TOUCHSCREEN); automation.injectInputEvent(motionUp, true); //Recycle our events back to the system pool. motionUp.recycle(); motionDown.recycle(); } 
    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.