转载文章请注明出处:http://blog.csdn.net/dangxw_/article/details/17960571
程序经常需要调试,需要程序自动按键,或者某些繁琐操作,比如游戏外挂,需要按键精灵来完成。
android 提供给开发者发送模拟按键的类Instrumentation:
java.lang.Object | |
↳ | android.app.Instrumentation |
Known Direct Subclasses |
可以模拟发送很多事件(这些方法写在thread类里,所以部分带有thread的sleep方法):
发送back事件:
private void back()
{
inst.sendKeyDownUpSync(KeyEvent.KEYCODE_BACK);
}
发送enter事件:(在keyevent中有很多按键码,该方法可以发送任何按键的事件)
private void enter() throws InterruptedException
{
inst.sendKeyDownUpSync(KeyEvent.KEYCODE_NUMPAD_ENTER);
sleep(500);
}
根据坐标点发送点击事件:
private void click(int x ,int y) throws InterruptedException
{
inst.sendPointerSync(MotionEvent.obtain(SystemClock.uptimeMillis(),
SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN, x, y, 0));
sleep(500);
inst.sendPointerSync(MotionEvent.obtain(SystemClock.uptimeMillis(),
SystemClock.uptimeMillis(), MotionEvent.ACTION_UP, x, y, 0));
}
根据坐标发送长按事件:
private void longClick(int x, int y) throws InterruptedException{
inst.sendPointerSync(MotionEvent.obtain(SystemClock.uptimeMillis(),
SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN, x, y, 0));
sleep(2000);
inst.sendPointerSync(MotionEvent.obtain(SystemClock.uptimeMillis(),
SystemClock.uptimeMillis(), MotionEvent.ACTION_UP, x, y, 0));
}
发送向下事件:
private void move() throws InterruptedException
{
inst.sendKeyDownUpSync(KeyEvent.KEYCODE_DPAD_DOWN);
sleep(500);
inst.sendKeyDownUpSync(KeyEvent.KEYCODE_DPAD_DOWN);
sleep(500);
}
发送move移动事件:
其实我感觉还是应该发送坐标点事件,只是把down和up之间发送部分move但是我实现起来却没有达到我想要移动的距离的效果,不贴出代码了,有点错误,期待阅读者的意见
但是这些代码的运行,需要给出
<uses-permission android:name = "android.permission.INJECT_EVENTS"/>
权限。
而且需要系统权限:android:sharedUserId="android.uid.system"
另外使用的手机必须root ,还要获取系统签名。
获取系统签名的具体步骤明天写吧。
写了一个demo 程序,传递一个简单的点击事件,这种方法可以实现跨进程点击,就是可以在后台发送点击事件,点击其他软件的组件。
demo下载地址:http://download.csdn.net/detail/dangxw_/7005525
---------------------------------------------------------------------------------------------------------------------分割线
看到自己的资源被喷了,才发现系统签名过程一直没有更新。当时是因为闲的没事而且csdn上没有了下载积分才记录下来这个虚拟按键过程的,最近一直比较忙,而且下班后住的地方没有网,所以一直没有写完。总之不好意思。
下载完那个demo之后导入,然后导出未签名的apk,点击项目,右键>android tools>Export unsigned application package.
然后下载签名工具,http://download.csdn.net/detail/dangxw_/7106645 里面自带的签名是4.3的好像,具体记不清了。
如果想要换个系统版本的签名,直接替换掉 platform.x509.pem,platform.pk8这两个文件就行了。
下载这两个文件的步骤详见:http://blog.sina.com.cn/s/blog_a72ec20c0101d7cx.html
那两个签名的路径为:build/target/product/security