2

ジョイスティック用の Android IME を開発しています。これはThread、特定のデバイスからのイベントを常にリッスンしている で構成され、いくつかの条件が true の場合に何かを実行することを決定します。このデバイスからの入力イベントを 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 に答える