2

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

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

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

4

1 回答 1

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();
    }
}
于 2013-06-29T10:04:10.637 回答