android - 在 4.3 android 版本的 uiautomator 中使用仪器类长按问题

标签 android android-uiautomator

我尝试使用 Motion Event 类和 instrumentation 类在屏幕上执行长按。

此类似乎适用于 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)

最佳答案

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();
        }
    }

关于android - 在 4.3 android 版本的 uiautomator 中使用仪器类长按问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19156959/

相关文章:

Java : implementing a template interface several time (with different class parameter)

android - 普通dp如何支持大屏?

java - 如何为 Imgflip API 实现 post 方法

java - 如何使用 UiAutomator 为谷歌时钟设置闹钟?

android - 如果连接了两个Android设备,如何在uiautomatorviewer上打开工作

java - 如何在Android Studio中将androidTest编译为Jar文件?

java - Tflite 模型在 Android(ml 视觉)和 Python 中提供不同的输出

android - 如何在 Android 中以编程方式访问省电模式?

android - 在我的 uiautomator 测试中,有什么比 sleep 更好的解决方法?

java - 如何从相对布局中提取文本并将其存储在 ArrayList 中