a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 系統(tǒng) > Android > 正文

android 使用uinput模擬輸入設(shè)備的方法

2020-04-11 11:56:41
字體:
供稿:網(wǎng)友

在google remote中,android接收端接收socket發(fā)來的IR CODE,然后將IR CODE模擬出來發(fā)給系統(tǒng)處理,這就是google remote接收端的原理。

系統(tǒng)端怎樣模擬input event呢?
方法一:通過Instrumentation.sendKeyDownUpSync 實(shí)現(xiàn),簡單使用但是問題在于sendKeyDownUpSync發(fā)出的event,無法運(yùn)行到
interceptKeyBeforeDispatching,也就無法正常作用 HOME,VOL...
方法二:通過uinput橋接;原理是利用內(nèi)核現(xiàn)有的uinput驅(qū)動,通過內(nèi)核驅(qū)動uinput來發(fā)送input event,而且還容易使用kl,kcm 客制化;


  經(jīng)過比較方法二較優(yōu),下面就就給出方法二的測試代碼...
  1、main函數(shù),setup_uinput_device 完成設(shè)備的注冊,然后創(chuàng)建一個線程 VirtualInputDev_EventThread,該線程重復(fù)發(fā)出keycode;

復(fù)制代碼 代碼如下:

  int main()
{


 printf("Enter process !!!! /n");

    stVirtualInputDevData *pKpdData = (stVirtualInputDevData*) malloc(sizeof(stVirtualInputDevData));
   pKpdData->min_keycode = umin_keycode;
   pKpdData->max_keycode = umax_keycode;
    if (setup_uinput_device(pKpdData) < 0) {
        printf("Unable to find uInput device/n");
        free(pKpdData);
        return -1;
    }

    pthread_attr_t attr;
    pthread_attr_init(&attr);
    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
    if (0 != pthread_create(&keypad_EventThreadId, &attr, VirtualInputDev_EventThread, (void *)0)) {
        printf("Create KeypadEventThread Failed!!/n");
        exit(1);
    }

    // Coverity server need set to ignore this.
    while (1) {
        usleep(1000000);  // sleep 1 second
    }

    free(pKpdData);
    pKpdData = 0;

    // Destroy the device
    ioctl(uinp_fd, UI_DEV_DESTROY);

    close(uinp_fd);
    return 0;
}

2、setup_uinput_device函數(shù),完成設(shè)備注冊;可以看到是直接打開uinput節(jié)點(diǎn),設(shè)置了虛擬設(shè)備的name,verdor,product,bustype,
   最后通過ioctl(uinp_fd, UI_DEV_CREATE)注冊設(shè)備

復(fù)制代碼 代碼如下:

   int setup_uinput_device(stVirtualInputDevData* mstVirtualInputDevData)
{
    struct uinput_user_dev uinp; // uInput device structure
    int i;

    // Open the input device
    uinp_fd = open("/dev/uinput", O_WRONLY | O_NDELAY);
    if (uinp_fd == 0) {
        printf("Unable to open /dev/uinput/n");
        return -1;
    }

    // Intialize the uInput device to NULL
    memset(&uinp, 0x00, sizeof(uinp));
    strncpy(uinp.name, "virtualinputdev", sizeof(uinp.name)-1);
    uinp.id.vendor = 0x1341;
    uinp.id.product = 0x0001;
    uinp.id.bustype = BUS_VIRTUAL;

    // Keyboard
    ioctl(uinp_fd, UI_SET_EVBIT, EV_KEY);
    for (i = mstVirtualInputDevData->min_keycode; i < mstVirtualInputDevData->max_keycode; i++) {
        ioctl(uinp_fd, UI_SET_KEYBIT, i);
    }

    // Create input device into input sub-system
    if (write(uinp_fd, &uinp, sizeof(uinp)) != sizeof(uinp)) {
        printf("First write returned fail./n");
        return -1;
    }

    if (ioctl(uinp_fd, UI_DEV_CREATE)) {
        printf("ioctl UI_DEV_CREATE returned fail./n");
        return -1;
    }

    return 1;
}

3、線程 VirtualInputDev_EventThread,只是重復(fù)發(fā)key,發(fā)key是通過write_event_to_device來完成的

復(fù)制代碼 代碼如下:

   static void* VirtualInputDev_EventThread(void *driver_data)
{

    unsigned char u8Keycode,i=umin_keycode;

    while (1) {
        u8Keycode = 0xff;

        /* sleep an interval time */
        usleep(2000000);//sleep 5 s
        /* fill event to uinput device. */
        write_event_to_device(i++, 0);
  if(i==4){
  i = 0;
  }
  printf ("virtualinputdev thread .../n");
  //i %= umax_keycode;
    }

    printf ("virtualinputdev thread died/n");
    pthread_exit(0);
    return 0;
}

4、write_event_to_device 寫event到uinput節(jié)點(diǎn)

復(fù)制代碼 代碼如下:

  void write_event_to_device(unsigned char u8KeyCode, unsigned char u8Repeat)
{
    struct input_event event; // Input device structure
    struct timespec s;
    s.tv_nsec = 5000000L;
    s.tv_sec = 0;

    memset(&event, 0x00, sizeof(event));
    gettimeofday(&event.time, 0);
    event.type = EV_KEY;
    event.code = u8KeyCode;
    event.value = 1;
    write(uinp_fd, &event, sizeof(event));

    memset(&event, 0x00, sizeof(event));
    gettimeofday(&event.time, 0);
    event.type = EV_KEY;
    event.code = u8KeyCode;
    event.value = 0;
    write(uinp_fd, &event, sizeof(event));

    memset(&event, 0x00, sizeof(event));
    gettimeofday(&event.time, 0);
    event.type = EV_SYN;
    event.code = SYN_REPORT;
    event.value = 0;
    write(uinp_fd, &event, sizeof(event));
}

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 青青草人人 | 中文字幕高清在线 | 中文字幕在线免费观看 | 天堂综合网 | 2021最新热播中文字幕-第1页-看片视频 亚洲第一男人天堂 | 久久精品久久久久 | 一区二区在线看 | 色香蕉在线 | 图片区 国产 欧美 另类 在线 | 日本久久精品视频 | 欧美1区 | 九九久久精品 | 国产精品69毛片高清亚洲 | 久久久久国产一区二区三区 | 欧美一区二区三区在线 | 国产精品久久久久无码av | 北条麻妃国产九九九精品小说 | 久久久久成人网 | 中文字幕一区二区三区四区五区 | 99久草| 中文字幕精品一区 | 亚洲经典视频在线观看 | 国产成人免费在线观看视频 | 日本a视频| 可以看黄的视频 | 国产亚洲综合一区二区 | 国产精品久久久久久久久久免费看 | 国产成人午夜精品影院游乐网 | 国产亚洲一区二区三区在线观看 | av 一区二区三区 | 希崎av在线| 色视频网站在线观看一=区 www..99re | 欧美日韩精品一区二区 | 密室大逃脱第六季大神版在线观看 | 久久久久久国产精品 | 欧美一区久久 | av色资源| www.国产欧美| 男女靠逼免费视频 | 日韩中文字幕免费在线 | 欧美精品三区 |