拦截操纵杆输入事件

时间:2013-06-29 08:55:11

标签: android android-ndk

我正在为操纵杆开发一个Android IME。它由一个Thread组成,它不断地监听来自特定设备的事件,然后如果某些条件成立,则决定做某事。有没有办法将输入事件从此设备专门绑定到我的IME,以便它们不会传播到应用程序?

我尝试在本机库中使用ioctl(fd,EVIOCGRAB,1)来对我的设备进行独占控制,但它似乎不起作用。

更新: EVIOCGRAB工作正常,这就是我解决问题的方法!

1 个答案:

答案 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();
    }
}