当前位置:  编程技术>移动开发

android 使用uinput模拟输入设备的方法

    来源: 互联网  发布时间:2014-10-22

    本文导语:  在google remote中,android接收端接收socket发来的IR CODE,然后将IR CODE模拟出来发给系统处理,这就是google remote接收端的原理。 系统端怎样模拟input event呢? 方法一:通过Instrumentation.sendKeyDownUpSync 实现,简单使用但是问题在于sendKe...

在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 devicen");
        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/uinputn");
        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 diedn");
    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));
}


    
 
 

您可能感兴趣的文章:

  • Android中文输入法 TouchPal
  • Android 繁体中文输入法
  • Android的文本和输入之创建输入法教程
  • Android 显示和隐藏输入法实现代码
  • Android中文输入法 OpenWnn
  • android输入框与文本框加滚动条scrollview示例
  • Android实现动态显示或隐藏密码输入框的内容
  • Android键盘输入语言设置默认打开myanmar缅甸语的步骤
  • 解决Fedora14下eclipse进行android开发,ibus提示没有输入窗口的方法详解
  • Android程序打开和对输入法的操作(打开/关闭)
  • Android开发技巧之像QQ一样输入文字和表情图像
  • Android中实现地址栏输入网址能浏览该地址网页源码并操作访问网络
  • Android 将 android view 的位置设为右下角的解决方法
  • Android工程:引用另一个Android工程的方法详解
  • Android 按后退键退出Android程序的实现方法
  • android 横竖屏限制的配置方法
  • android ListView自动滚动方法
  • Android开发之注册登录方法示例
  • Android获取本机电话号码的简单方法
  • android TextView不用ScrollViewe也可以滚动的方法
  • android获取手机唯一标识的方法
  • android 设置全屏的两种方法
  • Android中实现EditText圆角的方法
  • Android启动模拟器报错解决方法
  • Android设置桌面背景图片的实现方法
  • android真机调试时无法显示logcat信息的解决方法介绍
  • android开发教程之android的handler使用方法
  • android ListView的右边滚动滑块启用方法 分享
  • Android TextView设置背景色与边框的方法详解
  • Android实现信号强度监听的方法
  • android,不显示标题的方法小例子
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 申请Android Map 的API Key(v2)的最新申请方式(SHA1密钥)
  • Android瀑布流实例 android_waterfall
  • Android开发需要的几点注意事项总结
  • Android系统自带样式 (android:theme)
  • android 4.0 托管进程介绍及优先级和回收机制
  • Android网络共享软件 Android Wifi Tether
  • Android访问与手机通讯相关类的介绍
  • Android 图标库 Android GraphView
  • Android及andriod无线网络Wifi开发的几点注意事项
  • 轻量级Android开发工具 Android Tools
  • Android 2.3 下StrictMode介绍 iis7站长之家
  • Android 开发环境 Android Studio
  • IDEA的Android开发插件 idea-android
  • Android手机事件提醒 Android Notifier
  • XBMC的Android客户端 android-xbmcremote
  • Android小游戏 Android Shapes
  • Android电池监控 Android Battery Dog
  • android开发:“android:WindowTitle”没有对应项no resource
  • Android 上类似IOS 的开关控件。 Android ToggleButton
  • Android 2D游戏引擎 Android Angle
  • Android的UI工具包 android-ui-utils


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3