亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

android 使用uinput模擬輸入設備的方法

2020-04-11 11:56:41
字體:
來源:轉載
供稿:網友

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

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


  經過比較方法二較優,下面就就給出方法二的測試代碼...
  1、main函數,setup_uinput_device 完成設備的注冊,然后創建一個線程 VirtualInputDev_EventThread,該線程重復發出keycode;

復制代碼 代碼如下:

  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函數,完成設備注冊;可以看到是直接打開uinput節點,設置了虛擬設備的name,verdor,product,bustype,
   最后通過ioctl(uinp_fd, UI_DEV_CREATE)注冊設備

復制代碼 代碼如下:

   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,只是重復發key,發key是通過write_event_to_device來完成的

復制代碼 代碼如下:

   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節點

復制代碼 代碼如下:

  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));
}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91tv亚洲精品香蕉国产一区7ujn| 91成人福利在线| 国产精品美女免费视频| 成人性生交大片免费看小说| 国产女精品视频网站免费| 国产欧美va欧美va香蕉在| 欧美在线一级视频| 亚洲自拍欧美另类| 5252色成人免费视频| 国产精品久久9| 成人性生交大片免费看小说| 日韩激情av在线播放| 国产精品成人播放| 亚洲日韩欧美视频| 日韩精品免费在线播放| 91久久国产婷婷一区二区| 亚洲精品国产成人| 亚洲国产精品嫩草影院久久| 欧美在线一级va免费观看| 在线观看久久久久久| 国内精品久久久久影院 日本资源| 国产成一区二区| 久久精品最新地址| 久久久久久久久久久人体| 亚洲精品国产精品自产a区红杏吧| 久久成人这里只有精品| 欧美专区日韩视频| 精品在线观看国产| 日本欧美黄网站| 欧美精品videofree1080p| 日韩欧美在线观看视频| 亚洲摸下面视频| 中文字幕av一区二区三区谷原希美| xxx一区二区| 一区二区成人精品| 久久久久99精品久久久久| 4p变态网欧美系列| 亚洲欧美精品一区二区| 日韩视频在线免费| 日韩精品视频免费| 欧美极品在线播放| 国产精品亚洲аv天堂网| 色妞一区二区三区| 亚洲国产精品va在线看黑人动漫| 一夜七次郎国产精品亚洲| 日本电影亚洲天堂| 日本a级片电影一区二区| 欧美床上激情在线观看| 日韩欧美成人免费视频| 精品高清美女精品国产区| 国产成人啪精品视频免费网| 亚洲午夜精品久久久久久性色| 国产日韩欧美夫妻视频在线观看| 久久午夜a级毛片| 国产成+人+综合+亚洲欧美丁香花| 久久精品国产69国产精品亚洲| 国内精品视频在线| 成人综合网网址| 亚洲欧洲av一区二区| 国产极品jizzhd欧美| 国产一区二区三区在线看| 国产原创欧美精品| 久久精品视频一| 亚洲精品国产欧美| 日韩欧美国产黄色| 亚洲国产成人久久综合| 国产精品综合久久久| 国产精品自拍网| 欧美一乱一性一交一视频| 亚洲老板91色精品久久| 成人精品视频99在线观看免费| 这里只有精品视频在线| 久久久久久高潮国产精品视| 亚洲区在线播放| 亚洲图片欧美午夜| 美女精品久久久| 日韩av电影手机在线| 欧美成人合集magnet| 久久精品电影网站| 国内外成人免费激情在线视频| xxxx欧美18另类的高清| 欧美在线观看网址综合| 成人xvideos免费视频| 欧美日韩午夜视频在线观看| 久久久久成人网| 欧美激情图片区| 亚洲xxx视频| xxxxx91麻豆| www国产精品com| 久久精品视频免费播放| 日韩电影免费观看在线观看| 亚洲美女av网站| 国产精品高精视频免费| 欧美猛男性生活免费| 日日噜噜噜夜夜爽亚洲精品| 亚洲欧美精品一区二区| 中文字幕日韩在线观看| 97热精品视频官网| 亚洲人成在线电影| 欧美日本精品在线| 国产视频精品免费播放| 亚洲人成亚洲人成在线观看| 国产精品视频在线播放| 日韩av在线天堂网| 日韩精品在线观看网站| 在线精品91av| 亚洲精品天天看| 欧美黑人视频一区| 欧美激情综合色| 亚洲va欧美va国产综合久久| 国产精品一区二区av影院萌芽| 久久久精品国产网站| 国产中文欧美精品| 中文在线不卡视频| 亚洲毛片在线免费观看| 性欧美xxxx视频在线观看| 亚洲欧美激情另类校园| 亚洲欧美国产精品| 69av视频在线播放| 亚洲人成欧美中文字幕| 久久精品视频中文字幕| 久久中文字幕在线视频| 日韩精品一二三四区| 久久精品国产一区二区电影| 亚洲精品综合精品自拍| 在线视频欧美日韩| 性日韩欧美在线视频| 98精品国产高清在线xxxx天堂| 日韩成人激情视频| 国产精品一区二区在线| 中文字幕亚洲国产| 欧美成人免费视频| 国产98色在线| 久久久999精品| 亚洲男人天堂网| 伊人久久男人天堂| 日韩成人在线播放| 国产乱人伦真实精品视频| 狠狠做深爱婷婷久久综合一区| 欧美另类交人妖| 狠狠躁夜夜躁人人爽超碰91| 亚洲欧美中文日韩在线| 中文字幕亚洲一区二区三区五十路| 国产精品成人va在线观看| 欧美午夜视频在线观看| 精品久久久久久久久久久久久久| 国产精品老牛影院在线观看| 一区二区三区无码高清视频| 亚洲第一精品夜夜躁人人爽| 亚洲精品动漫久久久久| 亚洲午夜久久久久久久| 久久伊人精品一区二区三区| 亚洲人成网站免费播放| 97人人做人人爱| 韩日精品中文字幕| 另类色图亚洲色图| 欧美亚洲成人免费| 中文字幕日韩有码| 亚洲3p在线观看| 欧美国产日韩免费| 亚洲欧美另类中文字幕| 国产精品久久久久国产a级| 日韩高清中文字幕| 国产69精品99久久久久久宅男|