一、应用中模拟物理和屏幕点击事件

例如,模拟对某个view的点击事件

private void simulateClick(View view, float x, float y) {long downTime = SystemClock.uptimeMillis();final MotionEvent downEvent = MotionEvent.obtain(downTime, downTime,MotionEvent.ACTION_DOWN, x, y, 0);downTime += 1000;final MotionEvent upEvent = MotionEvent.obtain(downTime, downTime,MotionEvent.ACTION_UP, x, y, 0);view.onTouchEvent(downEvent);view.onTouchEvent(upEvent);downEvent.recycle();upEvent.recycle();
}public void setMouseClick(int x, int y){  MotionEvent evenDownt = MotionEvent.obtain(System.currentTimeMillis(),  System.currentTimeMillis() + 100, MotionEvent.ACTION_DOWN, x, y, 0);  dispatchTouchEvent(evenDownt);  MotionEvent eventUp = MotionEvent.obtain(System.currentTimeMillis(),  System.currentTimeMillis() + 100, MotionEvent.ACTION_UP, x, y, 0);  dispatchTouchEvent(eventUp);  evenDownt.recycle();  eventUp.recycle();
}  

这实现原理就是模拟两个MotionEvent (按下和提起) 然后用一个View 来处理这个Event 。

二、Instrumentation实现模拟键盘鼠标事件

// 可以不用在 Activity 中增加任何处理,各 Activity 都可以响应

Instrumentation inst = new Instrumentation();
inst.sendPointerSync(MotionEvent.obtain(SystemClock.uptimeMillis(),SystemClock.uptimeMillis(),   MotionEvent.ACTION_DOWN, 200, 500, 0));
inst.sendPointerSync(MotionEvent.obtain(SystemClock.uptimeMillis(),SystemClock.uptimeMillis(),   MotionEvent.ACTION_UP, 200, 500, 0));  

三、系统中模拟物理和屏幕点击事件

1、adb shell 进入手机命令行 
2、getevent -h 用法说明

shell@hwH60:/ $ getevent -h  Usage: getevent [-t] [-n] [-s switchmask] [-S] [-v [mask]] [-d] [-p] [-i] [-l] [-q] [-c count] [-r] [device]-t: show time stamps-n: don't print newlines-s: print switch states for given bits-S: print all switch states-v: verbosity mask (errs=1, dev=2, name=4, info=8, vers=16, pos. events=32, props=64)-d: show HID descriptor, if available-p: show possible events (errs, dev, name, pos. events)-i: show all device info and possible events-l: label event types and names in plain text-q: quiet (clear verbosity mask)-c: print given number of events then exit-r: print rate events are received[-t] 参数显示事件的时间戳
[-n] 取消事件显示时的换行符
[-s switchmask] 得到指定位的开关状态
[-S] 得到所有开关的状态
[-v [mask]] 根据mask的值显示相关信息
[-p] 显示每个设备支持的事件类型和编码
[-q] 只显示事件数据
[-c count] 只显示count次事件的数据
[-r] 显示事件接收频率

3、getevent -p 显示出来当前系统存在的所有input设备,并且把每个设备支持的事件类型以及编码

shell@hwH60:/ $ getevent -padd device 1: /dev/input/event2name:     "hi6421_on"events:KEY (0001): 0074 input props:<none>
could not get driver version for /dev/input/mouse0, Not a typewriter
add device 2: /dev/input/event4name:     "huawei,touchscreen"events:KEY (0001): 003b  003c  003d  003e  003f  0040  0041  0042 0043  0044  0057  00bd  00be  00bf  00c0  00c1 0145  014a ABS (0003): 0000  : value 0, min 0, max 1079, fuzz 0, flat 0, resolution 00001  : value 0, min 0, max 1919, fuzz 0, flat 0, resolution 00018  : value 0, min 0, max 255, fuzz 0, flat 0, resolution 00030  : value 0, min 0, max 15, fuzz 0, flat 0, resolution 00035  : value 0, min 0, max 1079, fuzz 0, flat 0, resolution 00036  : value 0, min 0, max 1919, fuzz 0, flat 0, resolution 00039  : value 0, min 0, max 15, fuzz 0, flat 0, resolution 0003a  : value 0, min 0, max 255, fuzz 0, flat 0, resolution 0input props:INPUT_PROP_DIRECT
add device 3: /dev/input/event0name:     "mhl_rcp_dev"events:KEY (0001): 0002  0003  0004  0005  0006  0007  0008  0009 000a  000b  000e  001c  0034  003b  003c  003d 003e  003f  0067  0069  006a  006c  0071  0072 0073  0077  0080  008b  009e  009f  00a1  00a4 00a5  00a7  00a8  00ae  00c8  00c9  00cf  00d0 00d5  00e8  0161  0163  0192  0193  019c input props:<none>
could not get driver version for /dev/input/mice, Not a typewriter
add device 4: /dev/input/event1name:     "hisi_gpio_key.14"events:KEY (0001): 0072  0073 input props:<none>
add device 5: /dev/input/event3name:     "hi3630_hi6401_CARD Headset Jack"events:KEY (0001): 0072  0073  00e2 SW  (0005): 0002  0004 input props:<none>

4、getevent 查看输入设备和查看事件 
打印输出log日志,等待输入设备,我们触摸屏幕或是手机物理按键,便会看到这里的变化

shell@hwH60:/ $ getevent例如:
/dev/input/event0: 0001 014a 00000001
/dev/input/event0: 0003 0000 000000f6
/dev/input/event0: 0003 0001 000002ed
/dev/input/event0: 0003 0035 000000f6
/dev/input/event0: 0003 0036 000002ed
/dev/input/event0: 0003 0032 00000001
/dev/input/event0: 0003 0039 00000000
/dev/input/event0: 0003 003a 00000043
/dev/input/event0: 0000 0002 00000000

他们四个参数对应的是device type code value 
device:指的是处理触摸和按键的输入设备。 
type:指的是事件类型,EV_SYN [0000] (同步事件),EV_KEY [0001] (按键事件),EV_ABS [0003] (绝对值事件) 
code 指的是前面type代表的事件中支持的编码。 
value 指的是值。

例如:需要模拟一次点击BACK键,模拟点击的功能通常都是使用 /dev/input/event0 这个输入设备,back键的类型为 0001(按键事件),BACK的编码为 0x9e 转换为十进制后即158

注意的是在getevent中code显示的是十六进制,而sendevent时需要用十进制

那我们输入如下命令即可模拟一次BACK键的按下和弹起:

adb shell sendevent /dev/input/event0 1 158 1
adb shell sendevent /dev/input/event0 1 158 0

5、input keyevent 命令

先列举 input keyevent 几个比较常用的code值:

input keyevent 3    // Homeinput keyevent 4    // Backinput keyevent 19  //Upinput keyevent 20  //Downinput keyevent 21  //Leftinput keyevent 22  //Rightinput keyevent 23  //Select/Okinput keyevent 24  //Volume+input keyevent 25  // Volume-input keyevent 82  // Menu 菜单

例如: 
点击back键

shell@hwH60:/ $ input keyevent 3

input text 命令 
输入框输入内容的。后面参数为 “字符串”,例如输入”helloworld”字符串

shell@hwH60:/ $ input text "helloworld!"

input tap 命令 
模拟单击事件 后面参数为: x y ,例如点击(168,252)位置

shell@hwH60:/ $ input tap 168 252

input swipe 命令 
此命令为滑动事件。例如:从 30 10 滑动到 30 100

shell@hwH60:/ $ input swipe 30 10 30 100

Android代码实现,注意需要root

private void execShellCmd(String cmd) {  try {  // 申请获取root权限,这一步很重要,不然会没有作用  Process process = Runtime.getRuntime().exec("su");  // 获取输出流  OutputStream outputStream = process.getOutputStream();  DataOutputStream dataOutputStream = new DataOutputStream(  outputStream);  dataOutputStream.writeBytes(cmd);  dataOutputStream.flush();  dataOutputStream.close();  outputStream.close();  } catch (Throwable t) {  t.printStackTrace();  }
}  execShellCmd("getevent -p");
execShellCmd("sendevent /dev/input/event0 1 158 1");
execShellCmd("sendevent /dev/input/event0 1 158 0");
execShellCmd("input keyevent 3");//home
execShellCmd("input text  'helloworld!' ");
execShellCmd("input tap 168 252");
execShellCmd("input swipe 100 250 200 280"); <uses-permission android:name = "android.permission.INJECT_EVENTS"/>

Android通过代码模拟物理、屏幕点击事件

Android 模拟屏幕点击和物理按键方式

Android 系统下模拟触点击的功能与权限

android跨进程事件注入(程序模拟用户输入)

Android系统上实现类似按键精灵的效果相关推荐

  1. Android拓展 lua实现类似按键精灵效果

    在android 上运行lua脚本,但是想用lua脚本的方式去实现自动按键的效果的话就得拓展lua关键字:我是直接在 AndroLua的基础上拓展的.很多人说为什么不用adb,adb只能实现简单的指令 ...

  2. android 类似按键精灵脚本_Android拓展 lua实现类似按键精灵效果

    在android 上运行lua脚本,但是想用lua脚本的方式去实现自动按键的效果的话就得拓展lua关键字:我是直接在 AndroLua的基础上拓展的.很多人说为什么不用adb,adb只能实现简单的指令 ...

  3. [转载]Android系统上(mv不可用)cp命令的替代方法

    Android系统上cp命令的替代方法 情况是这样的:该台Android手机不提供adb root的权限,但又不能装破解root权限的软件,若要往Android手机的/system/和/data/分区 ...

  4. 【新人求助】苹果允许开发者制作类似按键精灵的app吗?

    环境:ios.不越狱 我在网上搜了一下发现了一个app叫触摸精灵,但是貌似需要越狱才能使用,所以想问问大神们,苹果允许开发者制作类似按键精灵的app吗?如果我申请成为开发者,然后做一个类似按键精灵的a ...

  5. BCH收银APP已在Android系统上下载超10000次

    Bitcoin Cash Register 近日,"比特币耶稣"Roger Ver在BCH论坛r/reddit发帖称,BCH收银APP"Bitcoin Cash Regi ...

  6. 绝对精华,大牛教你在Android系统上安装linux发行版

    Install linux distribution (Debian/Ubuntu/Kali Linux/Fedora/openSUSE/Gentoo/RootFS/Arch Linux) on An ...

  7. 安卓设备刷linux发行版,绝对精华,大牛教你在Android系统上安装linux发行版

    Install linux distribution (Debian/Ubuntu/Kali Linux/Fedora/openSUSE/Gentoo/RootFS/Arch Linux) on An ...

  8. Android驱动(1)---Ubuntu中为Android系统上编写Linux内核驱动程序实现方法

    Ubuntu中为Android系统上编写Linux内核驱动程序实现方法 本文主要介绍在Ubuntu 上为Android系统编写Linux内核驱动程序, 这里对编写驱动程序做了详细的说明,对研究Andr ...

  9. 全志T507如何在Android系统上进行OTA升级

    OTA升级是Android系统所提供的标准软件升级方式.它功能十分强大,并且提供了完全升级(完整包)和增量升级(差异包)两种模式.https://www.forlinx.com/product/133 ...

  10. iEmu:在Linux、Windows、Mac、Android系统上仿真运行iOS应用

    iOS 是一个"封闭"的系统,而Android是一个"开放"的系统,两者可谓是泾渭分明.现在,iEmu试图打破这两个操作系统之间的界限.iEmu是当年最 早破解 ...

最新文章

  1. AAAI 2020 | MaskGEC:通过动态掩蔽改善语法纠错
  2. linux查找文件命令find
  3. python注入_Python如何考虑代码注入安全?
  4. SemEval-2022组队参赛啦!八节课带你入门全球最大的语义测评大赛
  5. App设计灵感之十二组精美的AR现实导航App设计案例
  6. [PY3]——内置数据结构(4)——字符串格式化(format)
  7. 软工随堂练 找出和值最大的子矩阵 尹亚男 赵静娜
  8. java复习题_java习题-(static)
  9. Unity 项目 - Ruby‘s Adventure 学习笔记
  10. 图片放大镜 jQuery插件
  11. 金牛判势 精品起涨预警 主升浪起爆点指标 通达信指标公式
  12. fgo服务器中断020202,fgo2.6版本更新 8月18日更新维护内容一览
  13. Github多人协作
  14. operands could not be broadcast together with shapes
  15. java判断闰年中闰月_闰年闰月查询表_闰月查询表_闰年查询表-万年历
  16. Python读取图像数据的常用方法
  17. python热搜排行功能_用Python做一个微博热搜榜的语音播报
  18. ‘Converting circular structure to JSON‘报错的解决方案
  19. 智能语音语义时代,产品经理怎么让AI更聪明?(效果向)
  20. 春招实习--海康威视凉--总结反思

热门文章

  1. 软考网络工程师备考经验
  2. mysql查询top5_MySQL常用函数TOP5
  3. 数据结构(C语言版 第2版)课后习题答案全集 严蔚敏
  4. linux两台电脑直连传数据,两台MAC电脑通过局域网快速传输文件
  5. 南阳理工ACM之房间安排
  6. C语言:32个关键字
  7. html网页做一个打字小游戏,原生js实现的金山打字小游戏(实例代码详解)
  8. 【离散数学】数理逻辑 第二章 谓词逻辑(4) 谓词逻辑的推理理论
  9. linux系统下载r软件安装,Linux安装R语言包
  10. 沟通管理-输入、输出、工具和技术