Android inject input events 注入Touch 点(x, y) 触摸输入事件
来源:互联网 发布:python split删除空格 编辑:程序博客网 时间:2024/06/11 12:38
1. 使用Instrumentation
new Thread(new Runnable() { @Override public void run() { Instrumentation mInst = new Instrumentation(); mInst.sendKeyDownUpSync(KeyEvent.KEYCODE_A); //按键事件 mInst.sendPointerSync(MotionEvent.obtain(SystemClock.uptimeMilis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN, point.x, point.y, 0); //触摸按下 mInst.sendPointerSync(MotionEvent.obtain(SystemClock.uptimeMilis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_UP, point.x, point.y, 0); //触摸抬起 } }).start();
查看sendPointerSync()
方法的源码会看到,它使用的是 injectInputEvent()
方法实现:
public void sendPointerSync(MotionEvent event) { validateNotAppThread(); if ((event.getSource() & InputDevice.SOURCE_CLASS_POINTER) == 0) { event.setSource(InputDevice.SOURCE_TOUCHSCREEN); } InputManager.getInstance().injectInputEvent(event, InputManager.INJECT_INPUT_EVENT_MODE_WAIT_FOR_FINISH); }
使用Instrumentation需要<uses-permission android:name="android.permission.INJECT_EVENTS"/>
权限,并且跨App注入事件需要系统应用(AndroidManifest.xml 中加入android:sharedUserId="android.uid.system"
)并且平台签名才行。
2. 使用反射直接调用injectInputEvent()
方法:
private void invokeInjectInputEvent(MotionEvent event) { Class cl = InputManager.class; try { Method method = cl.getMethod("getInstance"); Object result = method.invoke(cl); InputManager im = (InputManager) result; method = cl.getMethod("injectInputEvent", InputEvent.class, int.class); method.invoke(im, event, 0); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); }catch (InvocationTargetException e) { e.printStackTrace(); } }
3.使用Runtime.exec 执行
Process process = Runtime.getRuntime().exec("su"); DataOutputStream os = new DataOutputStream(process.getOutputStream()); String cmd = "/system/bin/input tap point.x point.y\n"; os.writeBytes(cmd); os.writeBytes("exit\n"); os.flush(); os.close(); process.waitFor();
或者直接:
Runtime.getRuntime().exec(new String[] {"su", "-c", "input tap " + point.x + " " + point.y});
4. 针对特定的应用可以使用Android Accessibility
5. 可以直接使用Adb shell
adb shell input tap point.x point.y
6.monkeyrunner是一个功能更为丰富的选项,不过需要连接电脑
参考链接:
1. http://azard.me/blog/2015/06/13/android-cross-app-touch-event-injection/
2. http://blog.csdn.net/mad1989/article/details/38109689
3. http://www.race604.com/android-inject-input-event/
0 0
- Android inject input events 注入Touch 点(x, y) 触摸输入事件
- Input Events(输入事件)
- Android 用户界面---输入事件(Input Events)
- Android 用户界面---输入事件(Input Events)
- Android 用户界面---输入事件(Input Events)
- starling教程-触摸事件(Touch Events)
- Responding to Touch Events 响应触摸事件
- starling教程-触摸事件(Touch Events)
- Input Events(输入事件)
- Android Touch 触摸事件
- android 在ViewGroup中处理触摸事件 [Managing Touch Events in a ViewGroup]
- iOS 9之Advanced Touch Input(高级触摸输入)
- Understanding Android Input Touch Events System Framework (dispatchTouchEvent, onInterceptTouchEvent
- Android Touch事件获取手指触摸位置
- android中的Touch触摸事件传递机制
- android进程inject注入
- Android inject 进程注入
- android 进程inject注入
- 逐渐新增N个Mnesia节点,并确保数据在这些节点上保持同步.
- 龍雲工作室用户隐私策略
- 爬虫之京东年度账单
- 里氏替换原则
- Python网络编程
- Android inject input events 注入Touch 点(x, y) 触摸输入事件
- AFNetworking2.0源码解析<一>
- Android程序点击启动后有黑屏或者白屏一闪而过解决办法
- Redis 哈希(Hash)
- Andorid实现退出客户端提示
- 开博感想。。
- 龍雲工作室用戶隱私策略
- MySQL的binlog日志
- 【OpenCV移植系列】01:OpenCV简介