android - 哪个设备文件接收我在 Android 上注入(inject)的 key ?

标签 android c linux

我设法以编程方式(C 代码)在我的 LG 设备上注入(inject)多点触控事件,将它们注入(inject)到 /dev/input/event0 中。 . 但是按键注入(inject)没有成功。我确实能够通过 adb shell input keyevent 注入(inject) key 但我在 /dev/input/event* 中没有看到任何事情发生文件。看起来他们都没有收到任何东西。有人知道如何将文件本地化到注入(inject) key 的位置吗? 提前致谢。

更新:

初始化设备代码:

ioctl (obj->m_fd, UI_SET_EVBIT,  EV_KEY);
ioctl (obj->m_fd, UI_SET_KEYBIT, BTN_TOUCH);
ioctl (obj->m_fd, UI_SET_KEYBIT, KEY_BACK);
ioctl (obj->m_fd, UI_SET_KEYBIT, KEY_HOMEPAGE);

for (i = KEY_RESERVED; i <= KEY_UNKNOWN; i++)
    ioctl(obj->m_fd, UI_SET_KEYBIT, i);

ioctl (obj->m_fd, UI_SET_EVBIT,  EV_ABS);
ioctl (obj->m_fd, UI_SET_ABSBIT, ABS_X);
ioctl (obj->m_fd, UI_SET_ABSBIT, ABS_Y);
ioctl (obj->m_fd, UI_SET_ABSBIT, ABS_MT_TOUCH_MAJOR);
ioctl (obj->m_fd, UI_SET_ABSBIT, ABS_MT_POSITION_X);
ioctl (obj->m_fd, UI_SET_ABSBIT, ABS_MT_POSITION_Y);
ioctl (obj->m_fd, UI_SET_ABSBIT, ABS_MT_TRACKING_ID);
ioctl (obj->m_fd, UI_SET_ABSBIT, ABS_MT_PRESSURE);

注入(inject)触摸事件代码(有效)

intSendEvent( obj->m_fd, EV_ABS, ABS_MT_TRACKING_ID, 0       );
intSendEvent( obj->m_fd, EV_ABS, ABS_MT_POSITION_X,  obj->x  );
intSendEvent( obj->m_fd, EV_ABS, ABS_MT_POSITION_Y,  obj->y  );
intSendEvent( obj->m_fd, EV_ABS, ABS_MT_TOUCH_MAJOR, obj->sq );
intSendEvent( obj->m_fd, EV_ABS, ABS_MT_PRESSURE,    obj->pr );
intSendEvent( obj->m_fd, EV_SYN, SYN_MT_REPORT, 0);
intSendEvent( obj->m_fd, EV_SYN, SYN_REPORT, 0);
intSendEvent( obj->m_fd, EV_SYN, SYN_MT_REPORT, 0);
intSendEvent( obj->m_fd, EV_SYN, SYN_REPORT, 0);

KEY_RESERVED <= obj->keyCode <=KEY_UNKNOWN处注入(inject)按键代码(不工作)

intSendEvent(obj->m_fd, EV_KEY, obj->keyCode, 1);
intSendEvent( obj->m_fd, EV_SYN, SYN_REPORT, 0);

intSendEvent(obj->m_fd, EV_KEY, obj->keyCode, 0);
intSendEvent( obj->m_fd, EV_SYN, SYN_REPORT, 0);

发送事件函数

void intSendEvent(int fd_kb,int type, int code, int value)
{
        debug("intSendEvent call (%d,%d,%d,%d)", fd_kb, type, code, value);
    struct uinput_event event;
    int len;

    if (fd_kb <= fileno(stderr))
            return;

    memset(&event, 0, sizeof(event));
    event.type = type;
    event.code = code;
    event.value = value;

    len = write( fd_kb, &event, sizeof(event) );

    debug("intSendEvent done:%d",len);
}

最佳答案

好吧,看起来我正在使用的设备没有内置键盘,因此 /dev/input 上没有设备文件,所以直接将文本注入(inject)设备文件看起来不可能。但是 getevent -lit 命令说我有以下设备:

add device 2: /dev/input/event6
  bus:      0000
  vendor    0000
  product   0000
  version   0000
  name:     "ats_input"
  location: ""
  id:       ""
  version:  1.0.1
  events:
    KEY (0001): KEY_ESC               KEY_1                 KEY_2                 KEY_3                
                KEY_4                 KEY_5                 KEY_6                 KEY_7                
                KEY_8                 KEY_9                 KEY_0                 KEY_END              
                KEY_VOLUMEDOWN        KEY_VOLUMEUP          KEY_POWER             KEY_SEND             
                KEY_NUMERIC_0         KEY_NUMERIC_1         KEY_NUMERIC_2         KEY_NUMERIC_3        
                KEY_NUMERIC_4         KEY_NUMERIC_5         KEY_NUMERIC_6         KEY_NUMERIC_7        
                KEY_NUMERIC_8         KEY_NUMERIC_9         KEY_NUMERIC_STAR      KEY_NUMERIC_POUND    
    ABS (0003): ABS_MT_TOUCH_MAJOR 

这对数字注入(inject)来说已经足够好了,对我来说也足够了。 adb shell input keyevent ... 使用虚拟键盘,因此没有使用设备文件(感谢 Chris Stratton)

关于android - 哪个设备文件接收我在 Android 上注入(inject)的 key ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19568296/

相关文章:

linux - 错误 : "grep: Argument list too long"

android - 未找到附加的属性 fab

android - 您可以在 Android 上的 XML 属性值中使用公式吗?

c - 错误 : Conversion to non-scalar type requested

c - 当数组在声明时初始化时,什么会导致 C 代码崩溃,但如果通过循环清零则不会崩溃?

node.js - 无法达到单个服务器的最大 tcp 连接数

android - 具有大量项目集合的 RecyclerView 和后台请求

java - 将捕获的视频存储在特定文件夹中并在视频 View 中播放视频

c - Linux何时/如何将共享库加载到地址空间中?

c - 如何使用 libcurl 登录安全网站并获取登录后的 html