使用Shell调用ADB指令方式来点击屏幕
来源:互联网 发布:Round it还是around it 编辑:程序博客网 时间:2024/06/11 23:51
1. 背景
老大最近有个需求要捕获一些东西(具体不能细说),然后在需求的最关键的一个点就归结到要点击一下别的APP的一个指定位置.
在网上搜索安卓按键模拟。用了很多方式都不太好,最后锁定了使用ADB调试的方案,向手机发送按键事件。刚好之前做过在Root权限下,用Java调用安卓底层的Linux Shell,然后执行pm指令使用Shell调用ADB指令.
使用Java执行Runtime.getRuntime().exec("su").getOutputStream()
,获取了一个具有Root权限的Process的输出流对象,向其中写入字符串即可以Root权限被Shell执行,ADB模拟按键的指令为 “input keyevent keyCode”,keyCode为按键的键值,例如KeyEvent.KEYCODE_VOLUME_UP表示音量加。 至于触屏或鼠标事件,只要调用相应的ADB指令即可。但是有一点问题,就是反应速度非常慢,尤其是连续模拟多个按键的时候,甚至会死机。而按键精灵运行的就相当流畅,我又开始好奇按键精灵是怎么实现的。 后来终于还是找到了原因,模拟按键时,不应每次都调用Runtime.getRuntime().exec(“su”),因为每次调用这个代码的时候,都会获取Runtime实例,并且执行”su”请求Root权限,反应就会很慢(我的理解是相当于每次都新开一个命令行窗口);而应该只是在一开始执行一次,并获取一个OutputStream实例,后来每次执行一条Shell指令,只需向其中写入相应字符串,这样就快了很多。 下面贴出可用的代码。要求设备已经Root,不需要其他任何特殊权限或签名。由于用的是ADB指令,兼容性也不会有太大问题。首次运行程序时(其实也就是执行Runtime.exec(“su”)的时候),会请求Root权限。
/** * 用root权限执行Linux下的Shell指令 * */public class RootShell { private OutputStream os; /** * 执行shell指令 * * @param cmd * 指令 */ public final void exec(String cmd) { try { if (os == null) { os = Runtime.getRuntime().exec("su").getOutputStream(); } os.write(cmd.getBytes()); os.flush(); } catch (Exception e) { e.printStackTrace(); } } /** * 后台模拟全局按键 * * @param keyCode * 键值 */ public final void simulateKey(int keyCode) { exec("input keyevent " + keyCode + "\n"); }}
其他参考博客
地址1
地址2
- 使用Shell调用ADB指令方式来点击屏幕
- 安卓adb调用模拟屏幕点击
- Android adb shell 获得点击屏幕的位置坐标
- Android adb shell 获得点击屏幕的位置坐标
- Android adb shell 获得点击屏幕的位置坐标
- adb shell 指令大全
- Android利用adb shell命令获取屏幕的点击坐标之横屏竖屏的区别
- [Android]通过adb shell input上报命令模拟屏幕点击事件
- Mac 上使用 Shell 脚本 + adb shell 实现简单的 Android 模拟点击自动化测试
- adb shell的使用
- adb shell 删除文件夹常用指令
- adb shell 模拟长按屏幕
- adb shell 命令查看屏幕尺寸
- adb shell模拟点击事件 input
- 我的Android进阶之旅------>Android中通过adb shell input来模拟滑动、按键、点击事件
- 我的Android进阶之旅------>Android中通过adb shell input来模拟滑动、按键、点击事件
- Android ---Adb指令的使用
- 通过adb shell来修改文件权限
- SQL 查询数据库中包含指定字符串的相关表和相关记录
- java实现标准化考试系统详解(四)-----初始化操作实现
- 记录 Linux环境下java web项目CPU爆表 “事故”,肇事者:GC
- Linux下线程知识
- OSW/OSWBB/OSWBBA的使用
- 使用Shell调用ADB指令方式来点击屏幕
- Android Wi-Fi Display(Miracast)介绍
- java 面向对象 多态
- 多表查询(表连接)
- JSP
- 【Leetcode344】. Reverse String-题解
- 银行管理系统(校企作业)
- Maven介绍,包括作用、核心概念、用法、常用命令、扩展及配置
- 华为机试---蘑菇阵(动态规划)