手机遥控器要求有模拟鼠标功能,之前别人做的模拟鼠标是用service加上自己画的图标来实现的,不能像真正鼠标一样方便,而且实现比较难。网上查找资料发现可以通过UInput来实现这个功能。

Uinput是一个虚拟的设备,使得可以在用户控件处理input设备,一般来讲uinput设备文件存在于/dev/input或者/dev/input/uinput目录中。在Linux中一切都是文件,所以使用uinput也很简单只需要open这个设备就可以了

打开设备:

extern "C"
JNIEXPORT int JNICALL
Java_com_remote_uinput_UInput_open(JNIEnv *env, jclass clazz) {struct uinput_user_dev uidev;//以只读的方式打开字符设备fd = open("/dev/uinput", O_WRONLY | O_NONBLOCK);
//    if (fd < 0) die("error: open ");LOGD( "fd == %d", fd);//打印出打开设备失败的原因,可以看看是否因为权限导致LOGD("open %s fail, %s\n", "/dev/uinput", strerror(errno));if (fd<0) {LOGD( "fd == %d", fd);return -1;}//config uinput working mode,  mouse or touchscreen?  relative coordinates or absolute coordinate?if (ioctl(fd, UI_SET_EVBIT, EV_KEY) < 0)         //support key buttondie("error: ioctl UI_SET_EVBIT");if (ioctl(fd, UI_SET_KEYBIT, BTN_LEFT) < 0)  //support mouse left keydie("error: ioctl  UI_SET_KEYBIT");if (ioctl(fd, UI_SET_KEYBIT, BTN_RIGHT) < 0)  //support mouse right keydie("error: ioctl UI_SET_KEYBIT");if (ioctl(fd, UI_SET_EVBIT, EV_REL) < 0)       //uinput use relative coordinatesdie("error: ioctl UI_SET_EVBIT");if (ioctl(fd, UI_SET_RELBIT, REL_X) < 0)         //uinput use x coordinatesdie("error: ioctl UI_SET_RELBIT REL_X");if (ioctl(fd, UI_SET_RELBIT, REL_Y) < 0)         //uinput use y coordinatesdie("error: ioctl REL_Y");memset(&uidev, 0,sizeof(uidev));                  //creat an virtul input device node in /dev/input/***snprintf(uidev.name, UINPUT_MAX_NAME_SIZE, "uinput-sample");//配置设备名称uidev.id.bustype = BUS_USB;//配置设备类型uidev.id.vendor = 0x1;//配置设备vendoruidev.id.product = 0x1;//配置设备productuidev.id.version = 1;//配置设备version//将配置写到uinput中if (write(fd, &uidev, sizeof(uidev)) < 0){die("error: write");return -1;}//通过ioctl创建这个虚拟设备if (ioctl(fd, UI_DEV_CREATE) < 0){die("error: ioctl");return -1;}return 1;
}

使用设备:

extern "C"
JNIEXPORT void JNICALL
Java_com_remote_uinput_UInput_simulateMouseMove(JNIEnv *env, jclass clazz, jint dx,jint dy) {struct input_event ev;//input_event 结构体//send input event to kernel input systemmemset(&ev, 0, sizeof(struct input_event));ev.type = EV_REL;         //send x coordinates 事件类型  EV_REL相对事件, EV_KEY key事件, EV_ABS绝对事件ev.code = REL_X;//键值ev.value = dx;//key 1 表示按下,0表示释放  鼠标代表移动距离if (write(fd, &ev, sizeof(struct input_event)) < 0)die("error: write");memset(&ev, 0, sizeof(struct input_event));ev.type = EV_REL;  //send y coordinatesev.code = REL_Y;ev.value = dy;if (write(fd, &ev, sizeof(struct input_event)) < 0)die("error: write");//    memset(&ev, 0, sizeof(struct input_event));
//    ev.type = EV_KEY;  //mouse left key 左键
//    ev.code = BTN_LEFT;
//    ev.value = 1;
//    if(write(fd, &ev, sizeof(struct input_event)) < 0)
//        die("error: write");//EV_SYN 同步 即执行这个事件memset(&ev, 0, sizeof(struct input_event));ev.type = EV_SYN; // inform input system to process this input eventev.code = 0;ev.value = 0;if (write(fd, &ev, sizeof(struct input_event)) < 0)die("error: write");
}

销毁:

extern "C"
JNIEXPORT void JNICALL
Java_com_ktc_remote_uinput_UInput_close(JNIEnv *env, jclass clazz) {//销毁这个设备if (ioctl(fd, UI_DEV_DESTROY) < 0)die("error: ioctl");//关闭这个文件close(fd);
}

这个方法不只是支持鼠标模拟,包括按键模拟,触摸屏模拟都可以实现,功能比较强大。

使用时需要注意,uinput这个文件不是可写的,低版本的系统可以在应用类修改文件权限,但是在高版本的Android中动态修改权限会失败,所以只能在系统初始化 init.rc中直接修改该文件为可读写,其次需要修改selinux权限,否则会因为权限不足无法创建设备。

Android 手机遥控器添加模拟鼠标功能相关推荐

  1. Android手机的12项额外功能

    Android手机的12项额外功能 手机能做服务器 苹果.微软和谷歌三大平台厂商对待手机操作系统的态度完全不同,iOS和Windows Phone以安全为由限制用户和开发者接触系统核心,让用户丧失了很 ...

  2. 意想不到:Android手机的12项额外功能

    意想不到:Android手机的12项额外功能 2014-05-28 09:48:16| 发布者: scy| 查看数:383 摘要: 5月28日消息,众所周知,苹果.微软和谷歌对待手机操作系统的态度是完 ...

  3. android 删除插件,Android手机如何添加删除桌面图标和插件

    基于Android系统的手机还是很人性化的,安装容易删除和卸载也不难,朴素的风格下对新手来说刚开始操作还是会有些不适应的.除可在应用市场上删除应用外,还可利用手机本身来删除图标,下面一起来看看操作方法 ...

  4. android usb共享代码,让Android手机具有USB网络共享功能,可以通过USB连接到Internet...

    第0章: 什么是USB网络共享功能 最近漫游Windows Phone的世界时,最新鲜的感觉之一就是诺基亚Lumia手机具有有趣的USB绑定功能,该功能使您的手机可以通过USB电缆连接到计算机,您可以 ...

  5. 如何在Android手机上添加“Recycle Bin”?

    我们电脑里的回收箱是我们一直在找的东西.它作为一种备份,我们将始终访问我们删除的文件,无论是否意外.毫无疑问,它请继续阅读,了解如何在Android设备上添加一个. 还有一些应用可以帮助您在Andro ...

  6. 【Delphi】Android 桌面图标添加快捷菜单功能

    目录 一.为什么需要桌面图标长按快捷菜单 二.实现Android桌面图标快捷菜单 第一步:Delphi 创建一个 FMX 工程文件:ShortCut_Demo.dpr 第二步:编辑项目中的 Andro ...

  7. Android 11.0 添加关机铃声功能实现

    1.前言 在11.0的系统rom定制化开发中,在原生系统中,关于开机铃声和关机铃声是默认不支持的,系统默认支持开机动画和关机动画等功能,所以关于增加开机铃声和关机 铃声的相关功能,需要自己增加相关的关 ...

  8. Android手机遥控器解决方案

    最近准备开始做一个解决方案项目,在这里做了一个前期准备工作.希望也可以为别人所用.废话不多说,开始:                       http://414543604.blog.163.c ...

  9. Android中用Java代码模拟鼠标指针(可显示于整个系统界面之上)

    Android有几款平板是有USB接口,连上鼠标后,界面上面就会出现一个鼠标指针,然后就可以用鼠标代替手势操作平板了,最近有项目需要用到鼠标指针,但是苦于不知道怎么调出系统的鼠标指针,所以只能用代码去 ...

最新文章

  1. 递归下降文法C语言实验报告,递归下降语法分析器实验报告.doc
  2. 《C++PrimerPlus》阅读笔记 + 源码实践
  3. linux 内核维护,Linux 4.18内核系列生命周期结束:用户需尽快更新内核
  4. python 二分查找_二分查找算法总结
  5. nagios mysql入库_使用NDOUtils将Nagios监控信息存入Mysql
  6. iis 创建应用程序池的方法与分析第3/3页
  7. Java虚拟机对内部锁的四种优化方式
  8. java打包-exe文件-最终以setup形式发布的解决之道
  9. python贪吃蛇游戏无法运行_Python贪吃蛇游戏编写代码
  10. 华为“不造车”的承诺,快到期了
  11. “我爱淘”冲刺阶段Scrum站立会议10
  12. 3GPP RAN第一次F2F会议,都干了些啥?
  13. 2021年中国保险行业现状:全年新增保单件数489亿件,保险金额为12146万亿元[图]
  14. Caused by: java.io.IOException: The temporary upload location [......] is not valid
  15. jq.ajax+php+mysql实现瀑布流缓冲加载数据
  16. 【自制】我造了一台 钢 铁 侠 的 机 械 臂 !【硬核】
  17. azure不支持哪些语句 sql_SQL Azure vs SQL Server
  18. SEO挖掘核心关键词的策略技巧
  19. 设计模式-优惠券-策略模式
  20. BIGEMAP GIS Office介绍

热门文章

  1. 基于cesium实现城市查询并定位
  2. 【干货】提取图片元数据之exiftool
  3. mysql pdo 端口_链接Mysql的api mysqli和pdo
  4. 【BUCTOJ训练: 质数的和与积(Python)】
  5. esp8266舵机驱动_使用Arduino和ESP8266通过网页控制舵机
  6. sql语句查询某天、某周、某月、某年的数据
  7. win10隐藏任务栏_win10系统任务栏彰显个性的设置方法
  8. Fer2013 数据集人脸表情识别 详细代码
  9. 从信号处理的角度研究毫米波联合雷达通信
  10. 《性能之巅—洞悉系统、企业与云计算》读书笔记---第二章