在Android 中,有些特定的功能或者在调试的时候需要模拟屏幕点击功能和物理按键等。

在实现上有2种方式:

首先是模拟屏幕点击的实现方式有两种:

模拟屏幕点击

  • 本进程内实现,就是只有在自己的app上面实现。
  • 跨进程实现,就是模拟点击手机屏幕的某个坐标。

不跨进程实现方式:

假如我们需要模拟点击某个按钮,这时候可以使用MotionEvent来实现,实现代码如下:

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

这实现原理就是模拟两个MotionEvent (按下和提起) 然后用一个View 来处理这个Event 。 这样就实现了模拟点击的操作,但是此种方式限制太大。本人觉得并没有什么用。

跨进程方式

跨进程方式其实就是整个手机系统中点击屏幕,并不局限于在某一个app内。
这种情况只能适用于已经ROOT的手机,通过执行shell命令来执行模拟操作。

  • getevent 命令 & sendevent 命令
    工具的源码位于Android SDK的system/core/toolbox下(sendevent.c getevent.c)。
    首先我这里模拟用adb命令模拟一次操作,Window 系统下进入cmd命令行:

执行 :

adb shell getevent

输出内容为:

add device 1: /dev/input/event4
name: ""
add device 2: /dev/input/event0
name: "Ft5x_dev"
add device 3: /dev/input/event5
name: "tegra-max98095 Headphone Jack"
add device 4: /dev/input/event6
name: "gpio-keys"
add device 5: /dev/input/event7
name: "Accelerometer"
could not get driver version for /dev/input/js0, Invalid argument
add device 6: /dev/input/event2
name: "compass"
add device 7: /dev/input/event3
name: "gyro"
add device 8: /dev/input/event1
name: "taos"

上面输出信息为设备名称和设备的属性,如果命令添加 -p 参数的话,就会显示详细信息。

这时候我们如果触摸手机屏幕或者按了物理按键的时候,命令窗口就会打印出信息:

如下:
/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
下面一一讲解上面参数的意义:

  • dev/input/event0指的是处理触摸和按键的输入设备。
  • 0003 指的是事件类型,EV_SYN [0000] (同步事件),EV_KEY [0001] (按键事件),EV_ABS [0003] (绝对值事件)
  • code 指的是0003代表的事件中支持的编码。具体代表就我这里就不写出来。
  • value 指的是值。

上面的getevent 命令的作用是查看输入设备和查看事件。

下面说说sendevent的功能。

用法为:adb shell sendevent device type code value

看到这里,其实我们已经能实现功能了,比如,我要模拟点击一下home 键,首先我用getevent命令的到点击这个HOME键的事件,我在用sendevent命令在发送一次同样的事件过去就实现了模拟再次点击HOMT键了。

下面说另一中方式:
模拟点击的功能通常都是使用 /dev/input/event0 这个输入设备

假如我需要模拟一次点击BACK键:

back键的类型为 0001(按键事件)

根据getevent - p 输出支持的信息可知BACK的编码为 0x9e 转换为十进制后即158(注意:sendevent 使用的进制是十进制)

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

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

input keyevent 命令

这个命令也可以模拟按键操作,使用格式为:input keyevent code
几个常用的code 为:

input keyevent 3    // Home
input keyevent 4    // Back
input keyevent 19  //Up
input keyevent 20  //Down
input keyevent 21  //Left
input keyevent 22  //Right
input keyevent 23  //Select/Ok
input keyevent 24  //Volume+
input keyevent 25  // Volume-
input keyevent 82  // Menu 菜单

input text 命令

这个命令是用来向输入框输入内容的。后面参数为 “字符串”

input tap 命令

这个命令为模拟单击事件 后面参数为: x y
比如在 30,30 单击一下 : input tap 30 30

input swipe 命令

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

最后说明一下如何用代码实现:

    /** * 执行shell命令 *  * @param cmd */  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();  }  }

Android 模拟屏幕点击和物理按键方式相关推荐

  1. Android模拟屏幕点击input tap替代解决方案

    动机解释 本来直接使用 adb shell -> input 即可模拟 键盘事件,触屏事件keyevent ,text,tap  但是手上的这台目标Android机4.0.3系统的input只支 ...

  2. android 模拟屏幕点击

    工作中有一个界面刚进入时要弹出一个popupwindow,里面有键盘,结果直接模拟点击事件不起作用,还报错, 12-26 17:01:08.636: D/CrashHandler(1795): and ...

  3. Android模拟屏幕点击,滑动等事件

    模拟事件全部是通过input命令来实现的,首先看一下input命令的使用: usage: input ... input text <string>        input keyeve ...

  4. android 模拟点击 不发出声音,【Android】代码实现模拟屏幕点击和键盘按键事件...

    最近参加某比赛写了一个Android手机控制Android电视的程序,其中需要控制电视端模拟"鼠标"点击,和模拟按键盘的事件. 下面直接贴上程序: // 模拟屏幕点击事件 publ ...

  5. Python模拟屏幕点击自动完成词达人任务(附源码)

    Python模拟屏幕点击自动完成微信词达人任务 该贴是以微信词达人为基础实践而写,如果我们并没有使用词达人,该源码中关键代码部分和模拟点击原理希望对大家有帮助. Python模拟屏幕点击自动完成微信词 ...

  6. QNX平台模拟屏幕点击事件

    前言 QNX系统下界面是以screen为单位,纵向分层显示.工作中遇到screenA的touch事件被screenB截获,导致screenA监测release事件一直未释放而无响应的问题.考虑在出现问 ...

  7. 【Android】技术调研:用代码模拟屏幕点击、触摸事件

    在Android中,有些场景需要使用代码来模拟人的操作,比如微信自动抢红包.UI测试等都需要模拟实现点击事件(Click).触摸事件(Touch).键盘事件(KeyBoard)等.那么,有没有现成的方 ...

  8. 【Android】代码实现模拟屏幕点击和键盘按键事件

    最近参加某比赛写了一个Android手机控制Android电视的程序,其中需要控制电视端模拟"鼠标"点击,和模拟按键盘的事件. 下面直接贴上程序: /*** 触发屏幕点击事件* @ ...

  9. adb inputswipe shell_[Android]通过adb shell input上报命令模拟屏幕点击事件【转】

    常用的 input上报命令: input text 1234 实际向界面注入1234文字,有输入框,能明显看到效果 input keyevent 4 键盘事件,4 为返回 input tap 100 ...

最新文章

  1. 如何高效读论文?剑桥CS教授亲授“三遍论”:论文最多读三遍,有的放矢,步步深入...
  2. python利器手机版-将安卓手机打造成你的python全栈开发利器
  3. python字符串转变量名_python 如何把在字符串里面的名字变成变量,进行复制
  4. Pymetrics开源公平性感知机器学习算法Audit AI
  5. hdu 1521 排列组合 多重集排列 + 指数生成函数
  6. python实验结论怎么写_Python实验课:Python元组数据及其运算
  7. Android UI设计之十一自定义ViewGroup,打造通用的关闭键盘小控件ImeObser
  8. python open 编码格式_Python以unicode编码格式读入外部文件
  9. eclipse中添加subclipse插件
  10. NanDigits GOF ECO 9介绍
  11. Android studio emulator Terminated
  12. 【MATLAB笔记】绘制图中图
  13. 数组公式和普通公式,差别在于思维方式的不同! 要用看数组的方式看待数据
  14. cookie和session的详解与区别
  15. 一款软件界面的重要性
  16. 互联网风雨十年,我所经历的技术变迁
  17. 函数模板和类模板详解
  18. 微信小程序项目实战:电影购票系统-李宁-专题视频课程
  19. 帝企鹅变形记:腾讯发展的秘密
  20. 每日一道Leetcode - 5. 最长回文子串 【动态规划】

热门文章

  1. 【Linux】冯诺依曼体系结构和操作系统概念
  2. Springboot项目 web 添加 favicon.ico图标
  3. R语言实现简单的网页数据抓取
  4. 计算机中什么是IRQ
  5. 分享一款好用的ssh工具
  6. python中使用opencv的HSV颜色空间提取物体
  7. 2022年云南最新建筑八大员(市政)模拟考试题库及答案
  8. Gunicorn-使用详解
  9. Dotween简单安装设置
  10. strstr(str1,str2) 函数