Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/203.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 拦截操纵杆输入事件_Android_Android Ndk - Fatal编程技术网

Android 拦截操纵杆输入事件

Android 拦截操纵杆输入事件,android,android-ndk,Android,Android Ndk,我正在为操纵杆开发android IME。它包含一个线程,该线程不断地监听来自特定设备的事件,然后如果某些条件为真,则决定执行某些操作。是否有一种方法专门将此设备的输入事件绑定到我的IME,以便它们不会传播到应用程序 我尝试在本机库中使用ioctl(fd,EVIOCGRAB,1)对我的设备进行独占控制,但似乎不起作用 更新:EVIOCGRAB工作正常,这就是我解决问题的方法 对于感兴趣的人,我终于找到了方法: 在“源”设备上使用此选项(这是可以与libEventInjector一起使用的本机代码

我正在为操纵杆开发android IME。它包含一个
线程
,该线程不断地监听来自特定设备的事件,然后如果某些条件为真,则决定执行某些操作。是否有一种方法专门将此设备的输入事件绑定到我的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();
    }
}