Android 拦截操纵杆输入事件
我正在为操纵杆开发android IME。它包含一个Android 拦截操纵杆输入事件,android,android-ndk,Android,Android Ndk,我正在为操纵杆开发android IME。它包含一个线程,该线程不断地监听来自特定设备的事件,然后如果某些条件为真,则决定执行某些操作。是否有一种方法专门将此设备的输入事件绑定到我的IME,以便它们不会传播到应用程序 我尝试在本机库中使用ioctl(fd,EVIOCGRAB,1)对我的设备进行独占控制,但似乎不起作用 更新:EVIOCGRAB工作正常,这就是我解决问题的方法 对于感兴趣的人,我终于找到了方法: 在“源”设备上使用此选项(这是可以与libEventInjector一起使用的本机代码
线程
,该线程不断地监听来自特定设备的事件,然后如果某些条件为真,则决定执行某些操作。是否有一种方法专门将此设备的输入事件绑定到我的IME,以便它们不会传播到应用程序
我尝试在本机库中使用ioctl(fd,EVIOCGRAB,1)
对我的设备进行独占控制,但似乎不起作用
更新:
EVIOCGRAB
工作正常,这就是我解决问题的方法 对于感兴趣的人,我终于找到了方法:
在“源”设备上使用此选项(这是可以与libEventInjector一起使用的本机代码):
我对这个很感兴趣。我不知道你所说的“控制一个函数的实例”是什么意思。如何指定哪个函数。还有,什么是GetExclucControl。是你自己的方法调用ioctl。。。上面的代码块?我想这是C代码。你能说得更详细些吗?也许是完整的java和c源文件?非常感谢。我所说的“控制一个函数的实例”是指,如果你在一个方法中调用该函数,只有该方法可以控制你的设备,而不是整个类。因此,您应该确保在这种方法中完成所有需要的操作,并最终释放控件。第一个块中的代码是C,它来自本机库。EVIOCGRAB 1表示需要独占控制,EVIOCGRAB 0表示释放控制。
int fd = open("/dev/input/eventX", O_RDONLY);
if(fd<0) return;
if(ioctl(fd,EVIOCGRAB,1) <0) return;
public class Class extends Thread{
boolean running = true;
public void run(){
mySourceDevice.getExclControl();
while(running){
}
mySourceDevice.releaseExclControl();
}
public void interrupt(){
runing=false;
super.interrupt();
}
}