使用Shell调用ADB指令方式来点击屏幕

本文由CSDN 迁移至此
原文

  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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 手机端配置tcp方式连接 su setprop service.adb.tcp.port 5555 stop ad...
    yoyo鹿鸣阅读 11,000评论 0 4
  • 文/柠檬红茶小星 先说说我自己吧,单身女性,喜欢:吃美食,看美剧韩剧,看综艺节目,看书,写博,做喜欢的事情,等等....
    柠檬红茶星酱阅读 2,994评论 0 1
  • 从今天开始记录下学习React-native的东西哈。npm installlnpm start 先上固定写法,先...
    butterflyer阅读 2,839评论 0 2
  • 自英国6月23日脱欧公投,镑美跌了2621点。 如果你从6月23号把全部家当投入,4天之后你就是百万富翁了 此刻你...
    士乾阅读 2,507评论 0 0
  • 每次老何一到店里来,首先听见的就是他的声音,老远就喊:摩托,摩托。最显眼的就是他的鞋子,每次都是擦得亮堂堂的。最喜...
    xgla枫叶阅读 1,265评论 0 0

友情链接更多精彩内容