2013-10-03 58 views
1

我嘗試使用運動事件類和工具類在屏幕上執行長按操作。使用uiautomator中的工具類進行長時間點擊問題4.3安卓版本

該類似乎對4.2及以下的設備工作正常,但是當我試圖實現對4.3的設備相同,我面臨着以下例外

可以在任何一個請幫我解決這個問題

由於提前

這是我用來執行長按事件的方法是

private void longClickOnScreen(float x, float y) { 
      try { 
       long downTime = SystemClock.uptimeMillis(); 
       long eventTime = SystemClock.uptimeMillis(); 
       MotionEvent event = MotionEvent.obtain(downTime, eventTime, 
         MotionEvent.ACTION_DOWN, x, y, 0); 
       MotionEvent event2 = MotionEvent.obtain(downTime, eventTime, 
         MotionEvent.ACTION_UP, x, y, 0); 
       inst.sendPointerSync(event); 
       Thread.sleep(750); 
       inst.sendPointerSync(event2); 
      } catch (NullPointerException e) { 
       // TODO: handle exception 
       e.printStackTrace(); 
      } 
     } 



java.lang.RuntimeException: This method can not be called from the main application thread 
      at android.app.Instrumentation.validateNotAppThread(Instrumentation.java:1651) 
      at android.app.Instrumentation.sendPointerSync(Instrumentation.java:933) 
      at com.kpt.adaptxt.uitest.event.EventHandler.longClickOnScreen(EventHandler.java:84) 
      at com.kpt.adaptxt.uitest.event.EventHandler.longClick(EventHandler.java:149) 
      at com.kpt.adaptxt.uitest.testsuite.UiautomationTestsuite.testLongpressEvent(UiautomationTes 
    tsuite.java:24) 
      at java.lang.reflect.Method.invokeNative(Native Method) 
      at com.android.uiautomator.testrunner.UiAutomatorTestRunner.start(UiAutomatorTestRunner.java 
    :160) 
      at com.android.uiautomator.testrunner.UiAutomatorTestRunner.run(UiAutomatorTestRunner.java:9 
    6) 
      at com.android.commands.uiautomator.RunTestCommand.run(RunTestCommand.java:91) 
      at com.android.commands.uiautomator.Launcher.main(Launcher.java:83) 
      at com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method) 
      at com.android.internal.os.RuntimeInit.main(RuntimeInit.java:235) 
      at dalvik.system.NativeStart.main(Native Method) 

回答

1
After lots of research I solved the above problem by using following piece of code 

private void longClickOnScreen(int x, int y) { 
     try { 
      long downTime = SystemClock.uptimeMillis(); 
      long eventTime = SystemClock.uptimeMillis(); 
      final MotionEvent eventDown = MotionEvent.obtain(downTime, 
        eventTime, MotionEvent.ACTION_DOWN, x, y, 0); 
      eventDown.setSource(InputDevice.SOURCE_TOUCHSCREEN); 
      final MotionEvent eventUp = MotionEvent.obtain(downTime, eventTime, 
        MotionEvent.ACTION_UP, x, y, 0); 
      eventUp.setSource(InputDevice.SOURCE_TOUCHSCREEN); 
      Thread task = new Thread(new Runnable() { 

       private Handler handler; 

       @Override 
       public void run() { 
        // TODO Auto-generated method stub 
        Looper.prepare(); 
        handler = new Handler(); 
        handler.post(new Runnable() { 

         @Override 
         public void run() { 
          // TODO Auto-generated method stub 
          inst.sendPointerSync(eventDown); 
          try { 
           Thread.sleep(750); 
          } catch (InterruptedException e) { 
           // TODO Auto-generated catch block 
           e.printStackTrace(); 
          } 
          inst.sendPointerSync(eventUp); 
         } 
        }); 
        Looper.loop(); 
       } 
      }); 
      task.start(); 
     } catch (NullPointerException e) { 
      e.printStackTrace(); 
     } 
    }