我正在为操纵杆开发一个Android IME。它由一个Thread
组成,它不断地监听来自特定设备的事件,然后如果某些条件成立,则决定做某事。有没有办法将输入事件从此设备专门绑定到我的IME,以便它们不会传播到应用程序?
我尝试在本机库中使用ioctl(fd,EVIOCGRAB,1)
来对我的设备进行独占控制,但它似乎不起作用。
更新: EVIOCGRAB
工作正常,这就是我解决问题的方法!
答案 0 :(得分:1)
对于谁感兴趣我终于找到了办法:
在“源”设备上使用它(它是可以与libEventInjector一起使用的本机代码):
int fd = open("/dev/input/eventX", O_RDONLY);
if(fd<0) return;
if(ioctl(fd,EVIOCGRAB,1) <0) return;
如果一切顺利,图书馆将拥有对设备的独占访问权限,现在在您的IME中启动一个不断阅读/dev/input/eventX
的线程,以便您可以阅读事件但不会传播到其他地方。
更新: EVIOCGRAB仅对Java类的函数实例进行独占控制。关闭程序时拦截事件而不阻塞设备的最佳方法是:
public class Class extends Thread{
boolean running = true;
public void run(){
mySourceDevice.getExclControl();
while(running){
}
mySourceDevice.releaseExclControl();
}
public void interrupt(){
runing=false;
super.interrupt();
}
}