在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模拟输入设备的方法相关推荐

  1. android uinput 按键_Android 触摸屏Event上报操作

    手机设备上常用触摸屏进行用户操作,非常方便快捷,而且正好有个项目上用到这个设备,所以就花时间研究了一下.好了,还是老规则:大体了解概念先,细节线索找代码: InputReader.cpp 中有针对单点 ...

  2. android释放焦点_Android videoview抢占焦点的处理方法

    问题描述: android 机顶盒应用: 应用程序主界面(MainActivity)只有两个控件,一个videoview和一个button. 视频框设置无焦点,按键有焦点. 首次进入应用时焦点正常,聚 ...

  3. android edittext不可复制_Android中使EditText只读的方法(可恢复编辑状态)

    可以通过以下几种方法实现EditText的只读属性 1. 方法一:使用EditText的android:Editable属性 将EditText的Editable属性设置为false后,EditTex ...

  4. android elf 加固_Android常见App加固厂商脱壳方法的整理

    目录 简述(脱壳前学习的知识.壳的历史.脱壳方法) 第一代壳 第二代壳 第三代壳 第N代壳 简述 Apk文件结构 Dex文件结构 壳史 壳的识别 Apk文件结构 Dex文件结构 壳史 第一代壳 Dex ...

  5. android蓝牙耳机按键流程,蓝牙耳机按键在Android侧的处理流程

    目前大多数音频视频设备采用红外遥控器,由于距离.角度.障碍物等的影响,红外遥控器的应用受到了很大限制.蓝牙无线通信技术可以实现传统红外遥控全部应用功能,而且客服了红外遥控器的局限性.蓝牙音频视频遥控应 ...

  6. 说说android下TV版本UC浏览器模拟鼠标的实现

    说说android下TV版本UC浏览器模拟鼠标的实现      无意中下载了一个TV版本的UC浏览器安装到机顶盒上,顺便体验了一把.感觉吗还行,原先以为UC浏览器会针对Android下TV的遥控器操作 ...

  7. 怎么看android底层源码,Android 底层按键获取

    与用户交互的输入设备(触摸屏,键盘等)是获取用户意图的来源.由于硬件本身的物理特性及由各大硬件厂商的标准不一,这将导致我们从设备上获取到的键值存在一定的差异性,为了让系统能够正确处理用户的操作,我们就 ...

  8. android 虚拟按键源码流程分析

    android 虚拟按键流程分析 今天来说说android 的虚拟按键的源码流程.大家都知道,android 系统的状态栏,虚拟按键,下拉菜单,以及通知显示,keyguard 锁屏都是在framewo ...

  9. Android back按键基础开发

    Android back按键基础开发 在app设计中, 通常都会针对用户的退出按钮进行特别的开发: 按下back按钮两次才退出应用 在ActionBar中新增回退按钮 增加按钮直接回退到主屏幕 -. ...

最新文章

  1. 湘潭大学网络编程_湘潭大学计算机学院网络空间安全学院“湘韵”研究生论坛成功举行...
  2. torch序列化 pickle 慢
  3. 零基础自学python教程-零基础学Python不迷茫——基本学习路线及教程
  4. Python 【大风号】短视频的自动上传与发布实例演示,同时支持抖音、快手、哔哩哔哩、小红书、微视、西瓜视频、微信视频号等平台的视频自动化同步发布
  5. 矩阵键盘程序_独立按键与矩阵按键
  6. APNS提供了两项基本的服务:消息推送和反馈服务
  7. 微软推出新语言Bosque,超越结构化程序设计
  8. LNMP详解(十)——Nginx负载分担实战
  9. 软件从“出生”到“消亡”的过程称为_软件测试面试最常问到的101个面试问题,你中枪了吗?(一)...
  10. 【数学建模】历年数学建模国赛评价类题目汇总
  11. sqlite和MySQL一些常用命令_sqlite3常用命令语法
  12. Java interviewee-基础知识《一》
  13. 董事长、总裁与CEO
  14. 今日新出 CV 论文汇总(含医学图像、目标检测、唇语识别、SLAM等)
  15. 黑马程序员-MyBatis 框架-最全入门笔记、阿伟看了都得说真大、真细、真全!!!
  16. Android 中触摸事件与点击事件分析
  17. Qt之与游戏手柄的交互(一)
  18. 论语.八佾之绘事后素
  19. 小学英语与计算机技术整合,信息技术与小学英语教学整合之我见.doc
  20. 问卷星文本导入问题实现

热门文章

  1. js webapp://_Project Student:维护Webapp(只读)
  2. java jvm调优_(第1部分,共3部分):有关性能调优,Java中的JVM,GC,Mechanical Sympathy等的文章和视频的摘要...
  3. java反射api研究_深入研究Java 8中的可选类API
  4. 新的JDK 11文件方法isSameContent()
  5. junit 参数化测试用例_JUnit:在参数化测试中命名单个测试用例
  6. Java命令行界面(第5部分):JewelCli
  7. Java命令行界面(第14部分):google-options
  8. 自定义注解 实现自定义消息_实现自定义的未来
  9. Dools的DMN运行时示例
  10. hibernate jpa_教程:Hibernate,JPA –第1部分