Android 手机遥控器添加模拟鼠标功能
手机遥控器要求有模拟鼠标功能,之前别人做的模拟鼠标是用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 手机遥控器添加模拟鼠标功能相关推荐
- Android手机的12项额外功能
Android手机的12项额外功能 手机能做服务器 苹果.微软和谷歌三大平台厂商对待手机操作系统的态度完全不同,iOS和Windows Phone以安全为由限制用户和开发者接触系统核心,让用户丧失了很 ...
- 意想不到:Android手机的12项额外功能
意想不到:Android手机的12项额外功能 2014-05-28 09:48:16| 发布者: scy| 查看数:383 摘要: 5月28日消息,众所周知,苹果.微软和谷歌对待手机操作系统的态度是完 ...
- android 删除插件,Android手机如何添加删除桌面图标和插件
基于Android系统的手机还是很人性化的,安装容易删除和卸载也不难,朴素的风格下对新手来说刚开始操作还是会有些不适应的.除可在应用市场上删除应用外,还可利用手机本身来删除图标,下面一起来看看操作方法 ...
- android usb共享代码,让Android手机具有USB网络共享功能,可以通过USB连接到Internet...
第0章: 什么是USB网络共享功能 最近漫游Windows Phone的世界时,最新鲜的感觉之一就是诺基亚Lumia手机具有有趣的USB绑定功能,该功能使您的手机可以通过USB电缆连接到计算机,您可以 ...
- 如何在Android手机上添加“Recycle Bin”?
我们电脑里的回收箱是我们一直在找的东西.它作为一种备份,我们将始终访问我们删除的文件,无论是否意外.毫无疑问,它请继续阅读,了解如何在Android设备上添加一个. 还有一些应用可以帮助您在Andro ...
- 【Delphi】Android 桌面图标添加快捷菜单功能
目录 一.为什么需要桌面图标长按快捷菜单 二.实现Android桌面图标快捷菜单 第一步:Delphi 创建一个 FMX 工程文件:ShortCut_Demo.dpr 第二步:编辑项目中的 Andro ...
- Android 11.0 添加关机铃声功能实现
1.前言 在11.0的系统rom定制化开发中,在原生系统中,关于开机铃声和关机铃声是默认不支持的,系统默认支持开机动画和关机动画等功能,所以关于增加开机铃声和关机 铃声的相关功能,需要自己增加相关的关 ...
- Android手机遥控器解决方案
最近准备开始做一个解决方案项目,在这里做了一个前期准备工作.希望也可以为别人所用.废话不多说,开始: http://414543604.blog.163.c ...
- Android中用Java代码模拟鼠标指针(可显示于整个系统界面之上)
Android有几款平板是有USB接口,连上鼠标后,界面上面就会出现一个鼠标指针,然后就可以用鼠标代替手势操作平板了,最近有项目需要用到鼠标指针,但是苦于不知道怎么调出系统的鼠标指针,所以只能用代码去 ...
最新文章
- 递归下降文法C语言实验报告,递归下降语法分析器实验报告.doc
- 《C++PrimerPlus》阅读笔记 + 源码实践
- linux 内核维护,Linux 4.18内核系列生命周期结束:用户需尽快更新内核
- python 二分查找_二分查找算法总结
- nagios mysql入库_使用NDOUtils将Nagios监控信息存入Mysql
- iis 创建应用程序池的方法与分析第3/3页
- Java虚拟机对内部锁的四种优化方式
- java打包-exe文件-最终以setup形式发布的解决之道
- python贪吃蛇游戏无法运行_Python贪吃蛇游戏编写代码
- 华为“不造车”的承诺,快到期了
- “我爱淘”冲刺阶段Scrum站立会议10
- 3GPP RAN第一次F2F会议,都干了些啥?
- 2021年中国保险行业现状:全年新增保单件数489亿件,保险金额为12146万亿元[图]
- Caused by: java.io.IOException: The temporary upload location [......] is not valid
- jq.ajax+php+mysql实现瀑布流缓冲加载数据
- 【自制】我造了一台 钢 铁 侠 的 机 械 臂 !【硬核】
- azure不支持哪些语句 sql_SQL Azure vs SQL Server
- SEO挖掘核心关键词的策略技巧
- 设计模式-优惠券-策略模式
- BIGEMAP GIS Office介绍