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

继续在网上搜索安卓按键模拟(其实那时都不知道用什么关键字好了,能想到的关键字都用遍了,但是搜索出来的结果,都是之前提到的那几个依赖源码环境和系统权限的方案)。发现有很多介绍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");
	}
}

写这篇文章的主要目的,并不是要强调这件事的难度,也不只是为了提出问题的解决方案(那样就没必要写前面那么多过程了)。而是想把我解决问题的过程完整的写出来,对我而言算是一个记录,对读者而言,没准能从中找到一些东西。

解决这个问题之后,后来意外的发现,这个问题其实有人已经解决了,并且发了博客。不幸的是,那篇博客被大量使用前两种思路的博客掩埋了,当时我怎么也没找到。这篇博客地址在此:

http://blog.csdn.net/aminfo/article/details/7785975

顺便说明一点,这篇博客中作者提到的缺点:反应速度较慢。前面提到我也越到了同样的问题,也已经给出了解决方案。

本文由jzj1993原创,转载请注明来源:http://www.hainter.com/android-key-simulation
(标注了原文链接的文章除外)

android模拟按键问题总结[使用IWindowManager.injectKeyEvent方法]

http://blog.csdn.net/xudongdong99/article/details/8857173

Android中使用隐藏API(大量图解)

http://163liufuliang.blog.163.com/blog/static/331651862013119114431760/

通过Runtime实现,代码如下:

[html] view plaincopy

  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值:

[html] view plaincopy

  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;
时间: 2025-01-14 10:39:48

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

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

本文转载自CSDN的jzj1993,原文连接:http://blog.csdn.net/jzj1993/article/details/39158865 有时我们需要使用安卓实现在后台模拟系统按键,比如对音量进行调节(模拟音量键),关闭前台正在运行的App(模拟返回键),或者模拟触屏事件.但是对于原生安卓系统而言,后台进程关闭前台进程,甚至模拟用户事件,进而操控整个系统,是不符合系统安全原则的,如果有这样的漏洞被病毒或恶意软件所利用,会非常危险. 由于一些特殊原因,我恰巧需要实现这样的功能,而又

thinkphp 中调用root权限python脚本

默认thinkphp使用apache用户,没有权限执行具有root权限的后台脚本,需要使用sudo. root权限下修改/etc/sudoers 添加文件的写权限:chmod u+w /etc/sudoers 编辑/etc/sudoers文件,找到这一 行:"root ALL=(ALL) ALL" 在起下面添加"apache ALL=(ALL)       NOPASSWD: ALL",然后保存退出. 撤销文件的写权限:chmod u-w /etc/sudoers

怎么样开启红米S2的Root权限

红米S2通过什么方式启用了Root超级权限?大伙都知道,安卓设备有Root超级权限,一旦手机启用了root相关权限,就可以实现更多的功能,比如大伙公司的营销部门,使用一些营销软件都需要在Root超级权限下执行,如果手机无能获的root的权限,即没办法正常使用具体的功能. 红米S2开发版系统本身拥有root权限管理工具,但是,如果你使用的是红米S2稳定版,建议先将红米S2刷入开发版,再进行root权限开通,下面我们介绍怎么样获得红米S2的root权限.我们可以在红米S2桌面找到安全中心并进入,点击

红米手机3S 3X获取ROOT权限的经验

红米手机3S 3X有木有方法启用了Root权限?大伙知道,android设备有Root权限,一旦手机启用了root相关权限,就能够实现更强的功能,举个例子,大伙部门的营销部门的妹子,使用大多数营销应用都需要在Root权限下使用,如果手机无能获的root的权限,则不能正常使用具体的功能.红米手机3S 3X开发版系统本身具备root权限管理工具,但是,如果你使用的是红米手机3S 3X稳定版,建议可以先将红米手机3S 3X刷入开发版,再进行root权限开启,下面给大伙讲解如何获得红米手机3S 3X的r

linux下恢复mysql的root权限方法

一不小心把mysql的root权限全部撤销了,网上找了很多方法来恢复,经过实践,发现这一个方法是可行的,特地记下来. 1.先敲一下 service mysqld stop 命令,这个命令的作用的停掉mysql.2.安全模式启动mysql,命令为:/usr/bin/mysqld_safe --skip-grant-tables (其中参数--skip-grant-tables的意思是跳过数据库验证)3.mysql -u root -p 登录mysql,不需要填写密码.4.选择数据库表mysql,命

点点守护为什么建议安卓手机别开root权限?

本文摘自点点守护新闻栏目为什么建议安卓手机别开root权限? 为什么建议安卓手机别开root权限?首先我们要知道什么是root root用户是系统中唯一的超级管理员,它具有等同于操作系统的权限.一些需要root权限的应用,比如广告阻挡就是需要root权限的. 对于很多喜欢鼓捣安卓手机的使用者来说,root手机是很平常不过的事了,获取root权限之后手机的作用就可以大幅提升,这对于不少用户来说还是比较有吸引力的.不过,获取手机root之后手机就面临着变成“砖机”的风险了 首先,root之后用户就可

安卓ROOT权限代码

android上root权限的代码,工具类还提供在手机上执行指令的方法.PS:并不是所有手机都能root成功,开发项目时尽量不要考虑root,这个代码看看就行. [1].[代码] [Java]代码 跳至 [1] ? 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 37 38 39 40 41 42 43 44 45 46 47 48 49 50 5

安卓中常用权限

安卓中常用权限 添加WiFi以及访问网络的权限:  <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" ></uses-permission>  <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" ></uses-permission>  &l

安卓一键ROOT, android root api sdk 服务支持

android 一键root sdk已经开发完毕,支持PC 及手机端: 鉴于现在手机端的需求比较大,特提供SDK外放服务:以及ROOT技术支持: 商务合作  ROOT后您可以: 1.删除系统应用,定制个性化系统 2.各种暗扣(当然现在国内环境不行,但是您有渠道还是可以的) 3.静默安装各种推广APP 4.打压竞争对手APP 5.后台静默刷流量 6.完全控制他人手机 7.等等等 安卓一键root sdk 服务,安卓root技术支持, android root sdk, android root a