android uinput 按键_android 使用uinput模拟输入设备的方法
在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));
}
android uinput 按键_android 使用uinput模拟输入设备的方法相关推荐
- android uinput 按键_Android 触摸屏Event上报操作
手机设备上常用触摸屏进行用户操作,非常方便快捷,而且正好有个项目上用到这个设备,所以就花时间研究了一下.好了,还是老规则:大体了解概念先,细节线索找代码: InputReader.cpp 中有针对单点 ...
- android释放焦点_Android videoview抢占焦点的处理方法
问题描述: android 机顶盒应用: 应用程序主界面(MainActivity)只有两个控件,一个videoview和一个button. 视频框设置无焦点,按键有焦点. 首次进入应用时焦点正常,聚 ...
- android edittext不可复制_Android中使EditText只读的方法(可恢复编辑状态)
可以通过以下几种方法实现EditText的只读属性 1. 方法一:使用EditText的android:Editable属性 将EditText的Editable属性设置为false后,EditTex ...
- android elf 加固_Android常见App加固厂商脱壳方法的整理
目录 简述(脱壳前学习的知识.壳的历史.脱壳方法) 第一代壳 第二代壳 第三代壳 第N代壳 简述 Apk文件结构 Dex文件结构 壳史 壳的识别 Apk文件结构 Dex文件结构 壳史 第一代壳 Dex ...
- android蓝牙耳机按键流程,蓝牙耳机按键在Android侧的处理流程
目前大多数音频视频设备采用红外遥控器,由于距离.角度.障碍物等的影响,红外遥控器的应用受到了很大限制.蓝牙无线通信技术可以实现传统红外遥控全部应用功能,而且客服了红外遥控器的局限性.蓝牙音频视频遥控应 ...
- 说说android下TV版本UC浏览器模拟鼠标的实现
说说android下TV版本UC浏览器模拟鼠标的实现 无意中下载了一个TV版本的UC浏览器安装到机顶盒上,顺便体验了一把.感觉吗还行,原先以为UC浏览器会针对Android下TV的遥控器操作 ...
- 怎么看android底层源码,Android 底层按键获取
与用户交互的输入设备(触摸屏,键盘等)是获取用户意图的来源.由于硬件本身的物理特性及由各大硬件厂商的标准不一,这将导致我们从设备上获取到的键值存在一定的差异性,为了让系统能够正确处理用户的操作,我们就 ...
- android 虚拟按键源码流程分析
android 虚拟按键流程分析 今天来说说android 的虚拟按键的源码流程.大家都知道,android 系统的状态栏,虚拟按键,下拉菜单,以及通知显示,keyguard 锁屏都是在framewo ...
- Android back按键基础开发
Android back按键基础开发 在app设计中, 通常都会针对用户的退出按钮进行特别的开发: 按下back按钮两次才退出应用 在ActionBar中新增回退按钮 增加按钮直接回退到主屏幕 -. ...
最新文章
- 湘潭大学网络编程_湘潭大学计算机学院网络空间安全学院“湘韵”研究生论坛成功举行...
- torch序列化 pickle 慢
- 零基础自学python教程-零基础学Python不迷茫——基本学习路线及教程
- Python 【大风号】短视频的自动上传与发布实例演示,同时支持抖音、快手、哔哩哔哩、小红书、微视、西瓜视频、微信视频号等平台的视频自动化同步发布
- 矩阵键盘程序_独立按键与矩阵按键
- APNS提供了两项基本的服务:消息推送和反馈服务
- 微软推出新语言Bosque,超越结构化程序设计
- LNMP详解(十)——Nginx负载分担实战
- 软件从“出生”到“消亡”的过程称为_软件测试面试最常问到的101个面试问题,你中枪了吗?(一)...
- 【数学建模】历年数学建模国赛评价类题目汇总
- sqlite和MySQL一些常用命令_sqlite3常用命令语法
- Java interviewee-基础知识《一》
- 董事长、总裁与CEO
- 今日新出 CV 论文汇总(含医学图像、目标检测、唇语识别、SLAM等)
- 黑马程序员-MyBatis 框架-最全入门笔记、阿伟看了都得说真大、真细、真全!!!
- Android 中触摸事件与点击事件分析
- Qt之与游戏手柄的交互(一)
- 论语.八佾之绘事后素
- 小学英语与计算机技术整合,信息技术与小学英语教学整合之我见.doc
- 问卷星文本导入问题实现
热门文章
- js webapp://_Project Student:维护Webapp(只读)
- java jvm调优_(第1部分,共3部分):有关性能调优,Java中的JVM,GC,Mechanical Sympathy等的文章和视频的摘要...
- java反射api研究_深入研究Java 8中的可选类API
- 新的JDK 11文件方法isSameContent()
- junit 参数化测试用例_JUnit:在参数化测试中命名单个测试用例
- Java命令行界面(第5部分):JewelCli
- Java命令行界面(第14部分):google-options
- 自定义注解 实现自定义消息_实现自定义的未来
- Dools的DMN运行时示例
- hibernate jpa_教程:Hibernate,JPA –第1部分