当前位置:   article > 正文

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

shell命令点击屏幕

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权限。

  1. /**
  2. * 用root权限执行Linux下的Shell指令
  3. *
  4. */
  5. public class RootShell {
  6. private OutputStream os;
  7. /**
  8. * 执行shell指令
  9. *
  10. * @param cmd
  11. * 指令
  12. */
  13. public final void exec(String cmd) {
  14. try {
  15. if (os == null) {
  16. os = Runtime.getRuntime().exec("su").getOutputStream();
  17. }
  18. os.write(cmd.getBytes());
  19. os.flush();
  20. } catch (Exception e) {
  21. e.printStackTrace();
  22. }
  23. }
  24. /**
  25. * 后台模拟全局按键
  26. *
  27. * @param keyCode
  28. * 键值
  29. */
  30. public final void simulateKey(int keyCode) {
  31. exec("input keyevent " + keyCode + "\n");
  32. }
  33. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36

其他参考博客
地址1
地址2

转载于:https://www.cnblogs.com/yasin27878/p/6480184.html

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/56377
推荐阅读
相关标签
  

闽ICP备14008679号