UiAutomation 跨应用操作三大利器:
setOnAccessibilityEventListener() 开启Accessibility
executeShellCommand() 执行shell命令(权限比Runtime.getRuntime().exec()高,相当于adb shell)
injectInputEvent() 注入事件,比如点击。
EventCode
public static final int ACTION_DOWN = 0; public static final int ACTION_UP = 1; public static final int ACTION_MOVE = 2;
先看看send event的方法:
Send Event
1.Instrumentation
Instrumentation inst = new Instrumentation();
nst.sendPointerSync
2.Uiautomation
mUiAutomation.injectInputEvent
3.IWindowManager
IWindowManager.Stub.asInterface(ServiceManager.getService("window"));
4.InputManager
MotionEvent me = getEvent();
InputManager.getInstance().injectInputEvent(me, 1)
5.IWindowManager
IBinder wmbinder = ServiceManager.getService( "window" ); IWindowManager m_WndManager = IWindowManager.Stub.asInterface( wmbinder ); // key down m_WndManager.injectKeyEvent( new KeyEvent( KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_A ),true ); // key up m_WndManager.injectKeyEvent( new KeyEvent( KeyEvent.ACTION_UP, KeyEvent.KEYCODE_A ),true );
6./dev/input/eventX 这个需要权限哦
Touch
MotionEvent event = MotionEvent.obtain(downTime, eventTime, 0, (float) x, (float) y, 0); //dowm
inst.sendPointerSync(MotionEvent.obtain(300 + downTime, 300 + eventTime, 1, (float) x, (float) y, 0)); //up
Swipe
xStep = (double)(upX - downX) / (double)swipeSteps; yStep = (double)(upY - downY) / (double)swipeSteps; ret = this.touchDown(downX, downY); if(drag) { SystemClock.sleep(this.mUiAutomatorBridge.getSystemLongPressTime()); } for(int i = 1; i < swipeSteps; ++i) { ret &= this.touchMove(downX + (int)(xStep * (double)i), downY + (int)(yStep * (double)i)); if(!ret) { break; } SystemClock.sleep(5L); } if(drag) { SystemClock.sleep(100L); } ret &= this.touchUp(upX, upY);
pinchOpen
private static MotionEvent getMotionEvent(long downTime, long eventTime, int action, List<PointerProperties> properties, List<PointerCoords> coordinates) { PointerProperties[] props = (PointerProperties[])properties.toArray(new PointerProperties[properties.size()]); PointerCoords[] coords = (PointerCoords[])coordinates.toArray(new PointerCoords[coordinates.size()]); return MotionEvent.obtain(downTime, eventTime, action, props.length, props, coords, 0, 0, 1.0F, 1.0F, 0, 0, 4098, 0); }