发行使用的仪器类长按在uiautomator 4.3 Android版 [英] Issue with Long click using instrumentation class in uiautomator for 4.3 android version

查看:305
本文介绍了发行使用的仪器类长按在uiautomator 4.3 Android版的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图用运动事件类和仪器仪表类在屏幕上进行长按。

本类似乎对4.2及以下的设备工作正常,但是当我试图实现对4.3设备我面临以下异常相同

可能任何一个请帮我解决这个问题。

由于提前

这是我用来执行长按事件的方法是

 私人无效longClickOnScreen(浮法X,浮法Y){
            尝试{
                长时间的停机= SystemClock.uptimeMillis();
                长EVENTTIME = SystemClock.uptimeMillis();
                MotionEvent事件= MotionEvent.obtain(停机时间,EVENTTIME,
                        MotionEvent.ACTION_DOWN,X,Y,0);
                MotionEvent EVENT2 = MotionEvent.obtain(停机时间,EVENTTIME,
                        MotionEvent.ACTION_UP,X,Y,0);
                inst.sendPointerSync(事件);
                视频下载(750);
                inst.sendPointerSync(EVENT2);
            }赶上(NullPointerException异常五){
                // TODO:处理异常
                e.printStackTrace();
            }
        } 了java.lang.RuntimeException:该方法不能从主应用程序线程称为
            在android.app.Instrumentation.validateNotAppThread(Instrumentation.java:1651)
            在android.app.Instrumentation.sendPointerSync(Instrumentation.java:933)
            在com.kpt.adaptxt.uitest.event.EventHandler.longClickOnScreen(EventHandler.java:84)
            在com.kpt.adaptxt.uitest.event.EventHandler.longClick(EventHandler.java:149)
            在com.kpt.adaptxt.uitest.testsuite.UiautomationTestsuite.testLong pressEvent(UiautomationTes
    tsuite.java:24)
            在java.lang.reflect.Method.invokeNative(本机方法)
            在com.android.uiautomator.testrunner.UiAutomatorTestRunner.start(UiAutomatorTestRunner.java
    :160)
            在com.android.uiautomator.testrunner.UiAutomatorTestRunner.run(UiAutomatorTestRunner.java:9
    6)
            在com.android.commands.uiautomator.RunTestCommand.run(RunTestCommand.java:91)
            在com.android.commands.uiautomator.Launcher.main(Launcher.java:83)
            在com.android.internal.os.RuntimeInit.nativeFinishInit(本机方法)
            在com.android.internal.os.RuntimeInit.main(RuntimeInit.java:235)
            在dalvik.system.NativeStart.main(本机方法)


解决方案

 大量的研究,我用下面这段code的解决了上述问题后,私人无效longClickOnScreen(INT X,int y)对{
        尝试{
            长时间的停机= SystemClock.uptimeMillis();
            长EVENTTIME = SystemClock.uptimeMillis();
            最后MotionEvent eventDown = MotionEvent.obtain(停机时间,
                    EVENTTIME,MotionEvent.ACTION_DOWN,X,Y,0);
            eventDown.setSource(InputDevice.SOURCE_TOUCHSCREEN);
            最后MotionEvent eventUp = MotionEvent.obtain(停机时间,EVENTTIME,
                    MotionEvent.ACTION_UP,X,Y,0);
            eventUp.setSource(InputDevice.SOURCE_TOUCHSCREEN);
            线程任务=新主题(新的Runnable(){                私人处理程序处理程序;                @覆盖
                公共无效的run(){
                    // TODO自动生成方法存根
                    尺蠖prepare()。
                    处理器=新的处理程序();
                    handler.post(新的Runnable(){                        @覆盖
                        公共无效的run(){
                            // TODO自动生成方法存根
                            inst.sendPointerSync(eventDown);
                            尝试{
                                视频下载(750);
                            }赶上(InterruptedException的E){
                                // TODO自动生成catch块
                                e.printStackTrace();
                            }
                            inst.sendPointerSync(eventUp);
                        }
                    });
                    Looper.loop();
                }
            });
            task.start();
        }赶上(NullPointerException异常五){
            e.printStackTrace();
        }
    }

I tried to performing long click on screen using the Motion Event class and instrumentation class.

This class seems to work fine for 4.2 and below devices but when I tried to implement the same on the 4.3 devices I'm facing the following exception

Could any one please help me out in resolving this problem

Thanks in Advance

The method which I used to perform long click event is

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

这篇关于发行使用的仪器类长按在uiautomator 4.3 Android版的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆