美文网首页
Android Native获取Event事件

Android Native获取Event事件

作者: Weller0 | 来源:发表于2021-09-18 17:26 被阅读0次

有时候需要在C环境下获取按键事件,但是又不能更改Activity。
1、获取InputQueue并轮询获取按键信息
通过Window中的takeInputQueue接口注册回调

public class KeyEventObserver implements InputQueue.Callback {
    private static final String TAG = KeyEventObserver.class.getSimpleName();
    private long mInputQueuePtr = 0;
    private QueryKeyEventHandler mQueryKeyEventHandler;

    public KeyEventObserver(Activity activity) {
        mQueryKeyEventHandler = new QueryKeyEventHandler(Looper.getMainLooper());
        activity.getWindow().takeInputQueue(this);
    }

    @Override public void onInputQueueCreated(InputQueue queue) {
        mInputQueuePtr = getInputQueuePtr(queue);
        Log.d(TAG, "onInputQueueCreated " + mInputQueuePtr);
        mQueryKeyEventHandler.start();
    }

    @Override public void onInputQueueDestroyed(InputQueue queue) {
        mQueryKeyEventHandler.stop();
        mInputQueuePtr = 0;
        Log.d(TAG, "onInputQueueDestroyed " + mInputQueuePtr);
    }

    private long getInputQueuePtr(InputQueue queue) {
        try {
            Method getNativePtr = InputQueue.class.getMethod("getNativePtr");
            return (long) getNativePtr.invoke(queue);
        } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
            e.printStackTrace();
        }
        return 0;
    }

    private class QueryKeyEventHandler extends Handler {
        private static final int MSG_START_QUERY = 10;

        public QueryKeyEventHandler(Looper looper) {
            super(looper);
        }

        @Override public void handleMessage(@NonNull Message msg) {
            switch (msg.what) {
                case MSG_START_QUERY:
                    start();
                    nativeQueryKeyEvent(mInputQueuePtr);
                    break;
            }
        }

        public void start() {
            removeMessages(MSG_START_QUERY);
            sendEmptyMessageDelayed(MSG_START_QUERY, 100);
        }

        public void stop() {
            removeMessages(MSG_START_QUERY);
        }
    }

    private native void nativeQueryKeyEvent(long inputQueuePtr);

    static {
        System.loadLibrary("svr_input_observer");
    }
}

2、在C实际获取按键等event信息

#include <jni.h>
#include <android/input.h>
extern "C" {
AInputQueue *pInputQueue = NULL;
JNIEXPORT void JNICALL Java_com_demossnwt_demo_1surface_KeyEventObserver_nativeQueryKeyEvent(JNIEnv *env, jobject clazz, jlong ptr) {
    if (pInputQueue == NULL) {
        pInputQueue = reinterpret_cast<AInputQueue *>(ptr);
    }
    if (AInputQueue_hasEvents(pInputQueue)) {
        AInputEvent *event;
        jint handle = AInputQueue_getEvent(pInputQueue, &event);
        jint type = AInputEvent_getType(event);
        jint keycode = -1;
        jint action = -1;
        if (AInputEvent_getType(event) == AINPUT_EVENT_TYPE_KEY) {
            keycode = AKeyEvent_getKeyCode(event);
            action = AKeyEvent_getAction(event);
        }
        AInputQueue_finishEvent(pInputQueue, event, handle); // 每次AInputQueue_getEvent之后必须调用AInputQueue_finishEvent
        LOGD("type=%d, keycode=%d, action=%d", type, keycode, action);
    }
}
}

相关文章

  • Android Native获取Event事件

    有时候需要在C环境下获取按键事件,但是又不能更改Activity。1、获取InputQueue并轮询获取按键信息通...

  • jQuery事件对象常用的属性和方法

    event.type:获取事件的类型 触发元素的事件类型 event.pageX 和 event.pageY:获取...

  • 第七课 js事件

    event事件对象 1、什么是event事件对象? 用来获取事件的详细信息:鼠标位置、键盘按键 ——例子:获取鼠标...

  • js事件

    event事件对象 1、什么是event事件对象? 用来获取事件的详细信息:鼠标位置、键盘按键 ——例子:获取鼠标...

  • 兼容

    事件绑定 移除事件 阻止事件冒泡 取消事件的默认行为 获取事件target 获取event对象 获取clientW...

  • 事件对象Event属性

    1. event.type(); 获取事件的类型 2.event.preventDefault(); 阻止事件的默...

  • event

    1. 事件对象的获取 var event = event || window.event; // 兼容写法, i...

  • 20-第二十章 event对象 阻止冒泡 注册/ 移除监听事件

    一、事件event对象 Event 对象 /ɪ'vent/ 事件用来获取事件的详细信息:鼠标位置、键盘按键 主...

  • python asyncio(二)

    event_loop get_event_loop() 获取事件循环loop set_event_loop(loo...

  • 微信公众号开发3Event获取

    这里根据微信开发文档, 获取Event $ev=$postObj->Event; // 获取关注事件 if($e...

网友评论

      本文标题:Android Native获取Event事件

      本文链接:https://www.haomeiwen.com/subject/nmrygltx.html