欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

浅析Android 模拟键盘鼠标事件

程序员文章站 2023-10-19 14:13:53
通过socket + instrumentation实现模拟键盘鼠标事件主要通过以下三个部分组成:socket编程:实现pc和emulator通讯,并进行循环监听servi...

通过socket + instrumentation实现模拟键盘鼠标事件主要通过以下三个部分组成:
socket编程:实现pc和emulator通讯,并进行循环监听
service服务:将socket的监听程序放在service中,从而达到后台运行的目的。这里要说明的是启动服务有两种方式,bindservice和startservice,两者的区别是,前者会使启动的service随着启动service的activity的消亡而消亡,而startservice则不会这样,除非显式调用stopservice,否则一直会在后台运行因为service需要通过一个activity来进行启动,所以采用startservice更适合当前的情形
instrumentation发送键盘鼠标事件:instrumentation提供了丰富的以send开头的函数接口来实现模拟键盘鼠标,如下所述:
sendcharactersync(int keycode)            //用于发送指定keycode的按键
sendkeydownupsync(int key)                //用于发送指定keycode的按键
sendpointersync(motionevent event)     //用于模拟touch
sendstringsync(string text)                   //用于发送字符串
注意:以上函数必须通过message的形式抛到message队列中。如果直接进行调用加会导致程序崩溃。
对于socket编程和service网上有很多成功的范例,此文不再累述,下面着重介绍一下发送键盘鼠标模拟事件的代码:

发送键盘keycode:
步骤1. 声明类handler变量
private static handler handler;
步骤2. 循环处理message
java代码:

复制代码 代码如下:

[font=宋体]//在activity的oncreate方法中对下列函数进行调用
private void createmessagehandlethread(){
//need start a thread to raise looper, otherwise it will be blocked
thread t = new thread() {
public void run() {
log.i( tag,"creating handler ..." );
looper.prepare();   //主线程创建时,会创建一
个默认的looper对象,而looper对象的创建,将自动创建一个message queue。其他非主线程,不会自动创建looper,要需要的时候,通过调
用prepare函数来实现。
handler = new handler(){
public void handlemessage(message msg) {
//process incoming messages here
}
};
looper.loop();
log.i( tag, "looper thread ends" );
}
};
t.start();
}[/font]

步骤3. 在接收到socket中的传递信息后抛出message
java代码:
复制代码 代码如下:

[font=宋体]handler.post( new runnable() {
public void run() {
instrumentation inst=new instrumentation();
inst.sendkeydownupsync(keycode);
}
} );[/font]

touch指定坐标,如下例子即
java代码:
复制代码 代码如下:

[font=宋体]touch point(240,400)
instrumentation inst=new instrumentation();
inst.sendpointersync(motionevent.obtain(systemclock.uptimemillis(),systemclock.uptimemillis(), motionevent.action_down, 240, 400, 0));
inst.sendpointersync(motionevent.obtain(systemclock.uptimemillis(),systemclock.uptimemillis(), motionevent.action_up, 240, 400, 0));[/font]

模拟滑动轨迹
将上述方法中间添加 motionevent.action_move