继续在网上搜索安卓按键模拟(其实那时都不知道用什么关键字好了,能想到的关键字都用遍了,但是搜索出来的结果,都是之前提到的那几个依赖源码环境和系统权限的方案)。发现有很多介绍ADB调试,向手机发送按键事件的文章。刚好之前做过在Root权限下,用Java调用安卓底层的Linux Shell,然后执行pm指令进行APK的安装卸载。这时我突发奇想,能否用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指令
*
* @author jzj
* @since 2014-09-09
*/
public class RootShellCmd { 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");
}
}
 
写这篇文章的主要目的,并不是要强调这件事的难度,也不只是为了提出问题的解决方案(那样就没必要写前面那么多过程了)。而是想把我解决问题的过程完整的写出来,对我而言算是一个记录,对读者而言,没准能从中找到一些东西。
 
解决这个问题之后,后来意外的发现,这个问题其实有人已经解决了,并且发了博客。不幸的是,那篇博客被大量使用前两种思路的博客掩埋了,当时我怎么也没找到。这篇博客地址在此:
 
 
顺便说明一点,这篇博客中作者提到的缺点:反应速度较慢。前面提到我也越到了同样的问题,也已经给出了解决方案。
 
本文由jzj1993原创,转载请注明来源:http://www.hainter.com/android-key-simulation
(标注了原文链接的文章除外)
 
android模拟按键问题总结[使用IWindowManager.injectKeyEvent方法]
 
Android中使用隐藏API(大量图解)  
 

通过Runtime实现,代码如下:

  1. try
  2. {
  3. String keyCommand = "input keyevent " + KeyEvent.KEYCODE_MENU;
  4. Runtime runtime = Runtime.getRuntime();
  5. Process proc = runtime.exec(keyCommand);
  6. }
  7. catch (IOException e)
  8. {
  9. // TODO Auto-generated catch block
  10. e.printStackTrace();
  11. }

这个代码是模拟菜单键,模拟其它按键只需将KeyEvent.KEYCODE_MENU替换成其它键值。

缺点:反应速度较慢

以下附带各KeyCode值:

  1. KEYCODE_UNKNOWN=0;
  2. KEYCODE_SOFT_LEFT=1;
  3. KEYCODE_SOFT_RIGHT=2;
  4. KEYCODE_HOME=3;
  5. KEYCODE_BACK=4;
  6. KEYCODE_CALL=5;
  7. KEYCODE_ENDCALL=6;
  8. KEYCODE_0=7;
  9. KEYCODE_1=8;
  10. KEYCODE_2=9;
  11. KEYCODE_3=10;
  12. KEYCODE_4=11;
  13. KEYCODE_5=12;
  14. KEYCODE_6=13;
  15. KEYCODE_7=14;
  16. KEYCODE_8=15;
  17. KEYCODE_9=16;
  18. KEYCODE_STAR=17;
  19. KEYCODE_POUND=18;
  20. KEYCODE_DPAD_UP=19;
  21. KEYCODE_DPAD_DOWN=20;
  22. KEYCODE_DPAD_LEFT=21;
  23. KEYCODE_DPAD_RIGHT=22;
  24. KEYCODE_DPAD_CENTER=23;
  25. KEYCODE_VOLUME_UP=24;
  26. KEYCODE_VOLUME_DOWN=25;
  27. KEYCODE_POWER=26;
  28. KEYCODE_CAMERA=27;
  29. KEYCODE_CLEAR=28;
  30. KEYCODE_A=29;
  31. KEYCODE_B=30;
  32. KEYCODE_C=31;
  33. KEYCODE_D=32;
  34. KEYCODE_E=33;
  35. KEYCODE_F=34;
  36. KEYCODE_G=35;
  37. KEYCODE_H=36;
  38. KEYCODE_I=37;
  39. KEYCODE_J=38;
  40. KEYCODE_K=39;
  41. KEYCODE_L=40;
  42. KEYCODE_M=41;
  43. KEYCODE_N=42;
  44. KEYCODE_O=43;
  45. KEYCODE_P=44;
  46. KEYCODE_Q=45;
  47. KEYCODE_R=46;
  48. KEYCODE_S=47;
  49. KEYCODE_T=48;
  50. KEYCODE_U=49;
  51. KEYCODE_V=50;
  52. KEYCODE_W=51;
  53. KEYCODE_X=52;
  54. KEYCODE_Y=53;
  55. KEYCODE_Z=54;
  56. KEYCODE_COMMA=55;
  57. KEYCODE_PERIOD=56;
  58. KEYCODE_ALT_LEFT=57;
  59. KEYCODE_ALT_RIGHT=58;
  60. KEYCODE_SHIFT_LEFT=59;
  61. KEYCODE_SHIFT_RIGHT=60;
  62. KEYCODE_TAB=61;
  63. KEYCODE_SPACE=62;
  64. KEYCODE_SYM=63;
  65. KEYCODE_EXPLORER=64;
  66. KEYCODE_ENVELOPE=65;
  67. KEYCODE_ENTER=66;
  68. KEYCODE_DEL=67;
  69. KEYCODE_GRAVE=68;
  70. KEYCODE_MINUS=69;
  71. KEYCODE_EQUALS=70;
  72. KEYCODE_LEFT_BRACKET=71;
  73. KEYCODE_RIGHT_BRACKET=72;
  74. KEYCODE_BACKSLASH=73;
  75. KEYCODE_SEMICOLON=74;
  76. KEYCODE_APOSTROPHE=75;
  77. KEYCODE_SLASH=76;
  78. KEYCODE_AT=77;
  79. KEYCODE_NUM=78;
  80. KEYCODE_HEADSETHOOK=79;
  81. KEYCODE_FOCUS=80;//*Camera*focus
  82. KEYCODE_PLUS=81;
  83. KEYCODE_MENU=82;
  84. KEYCODE_NOTIFICATION=83;
  85. KEYCODE_SEARCH=84;
  86. KEYCODE_MEDIA_PLAY_PAUSE=85;
  87. KEYCODE_MEDIA_STOP=86;
  88. KEYCODE_MEDIA_NEXT=87;
  89. KEYCODE_MEDIA_PREVIOUS=88;
  90. KEYCODE_MEDIA_REWIND=89;
  91. KEYCODE_MEDIA_FAST_FORWARD=90;
  92. KEYCODE_MUTE=91;

安卓使用Root权限实现后台模拟全局按键、触屏事件方法(类似按键精灵)的更多相关文章

  1. 转:Android随笔之——使用Root权限实现后台模拟全局按键、触屏事件方法(类似按键精灵)

    本文转载自CSDN的jzj1993,原文连接:http://blog.csdn.net/jzj1993/article/details/39158865 有时我们需要使用安卓实现在后台模拟系统按键,比 ...

  2. Delphi编写的Android程序获取Root权限实现(2015.4.15更新,支持Android 4.4)

    借助谷歌,并经过本大侠施展坑.蒙.拐.骗.偷五大绝技,终于成功实现在Delphi下获取Root权限并将其扩展为一个完整功能更加完整的TQAndroidShell记录,在华为荣耀2(Android 4. ...

  3. Blender模拟全局照明的简单方法

    https://en.wikibooks.org/wiki/Blender_3D:_Noob_to_Pro/Faked_Gi_with_Blender_internal模拟全局照明最简单的方法是在我们 ...

  4. 使用fakeroot模拟root权限执行程序(转)

    Hack #57: 使用fakeroot模拟root权限执行程序 fakeroot是什么 例如Debian在生成package的时候,编译完之后,不能立刻在当前环境执行make install,需要执 ...

  5. 安卓学习笔记--已root设备应用请求root权限

    网上查到的方法 Process process = null; DataOutputStream os = null; try { String cmd = "chmod 777 " ...

  6. Android权限说明 system权限 root权限

    原文链接:http://blog.csdn.net/rockwupj/article/details/8618655 Android权限说明 Android系统是运行在Linux内核上的,Androi ...

  7. Stick hero "攻略", android 代码编写与分析(后台截屏, 后台模拟点击)

    论文写完,感觉头脑好久没被灵感刺激了,前些天室友介绍了个小游戏,我突然来了灵感可以写的简单的android 程序实现自动运行.主要的过会为三步: 1,Android 屏幕的获取.因为安全的原因,过程比 ...

  8. [Android Pro] Android fastboot刷机和获取Root权限

    参考文章: https://developers.google.com/android/nexus/images 转载自:    http://www.inexus.co/article-1280-1 ...

  9. 取之有道——巧用Root权限 启动其他APP中的Activity

    这次博主来分享一个很巧妙的办法来启动其他APP中Activity的方法. 首先说一下这样做的目的:最近博主在攻克一个技术难点,就是搞定某些三方系统中,对于应用权限的限制.为此给出用户指导,引导用户启动 ...

随机推荐

  1. $(this).bind("change",itemno_change);

    如果是onchange 会出错,超过3个可能就无效.

  2. 安卓开发笔记——WebView组件

    我们专业方向本是JAVA Web,这学期突然来了个手机App开发的课设,对于安卓这块,之前自学过一段时间,有些东西太久没用已经淡忘了 准备随笔记录些复习笔记,也当做温故知新吧~ 1.什么是WebVie ...

  3. 如何用BarTender将日期变量和序列号变量放一起打印成条码?

    刚接触BarTender 2016的小伙伴们可能对条码的数据源还不太搞的定,例如有时需要将日期变量和序列号变量放一起打印成条码,那如何简单达到目的呢?下面,小编教大家解决这一问题的三大步骤. 1.在B ...

  4. 消息中间件的意义和应用场景 (activeMq)

    消息中间件一般两个功能,解耦和异步处理,分别举个例子吧 解耦合:比如我们做一个微博产品中的好友系统,就很需要使用消息中间件当我们添加一个关注的时候, 涉及以下几个子系统 推荐系统,需要根据你关注的人给 ...

  5. mysql数据库中查看当前使用的数据库是哪个数据库?

    环境描述: mysql版本:5.5.57-log 操作系统版本:Red Hat Enterprise Linux Server release 6.6 (Santiago) 需求说明: 查看当前使用的 ...

  6. 基于jQuery的tooltips插件--poshytip

    摘要: 分享一款在项目中使用的tooltips插件--poshytip,这是一款基于jQuery的插件,其特点是简单易用,支持浏览器:IE6+, FF 2+, Opera 9+, Safari 3+, ...

  7. Java Jdk1.8 HashMap源代码阅读笔记二

    三.源代码阅读 3.元素包括containsKey(Object key) /** * Returns <tt>true</tt> if this map contains a ...

  8. 8 -- 深入使用Spring -- 1...4 属性占位符配置器

    8.1.4 属性占位符配置器 PropertyPlaceholderConfigurer 是一个容器后处理器,负责读取Properties属性文件里的属性值,并将这些属性值设置成Spring配置文件的 ...

  9. Linux od命令(以指定进制显示文件)

    从“读取二进制文件”出发,到od命令的使用 在桃村实习期间,一直努力做毕业设计,我的毕业设计中有一个内容就是读取SEGY文件.在读取文件时,经常遇到的问题时你要读取浮点型数据,这时你就必须考虑你所使用 ...

  10. 消息中间件activemq-5.14.1安全验证配置

    activemq分为控制端和客户端,下面分别介绍安全认证配置方法. 1.控制端安全配置 (1). ActiveMQ目录conf下找到jetty.xml: <bean id="secur ...