转自:http://blog.sina.com.cn/s/blog_602f87700102uz8j.html

在Android系统下模拟鼠标键盘等输入设备,网络上资料非常多。但不少是人云亦云,甚至测试都不愿测试一下就抄上来了。这次写一点体会,当作抛砖引玉。

0.背景知识:
众所周知,Android是将Framework架在Linux之上的系统。Linux层和硬件打交道,Framework通过JNI等途径得到底层信息。
消息的传递是:Linux -> Framework -> Application
因为此架构的特性,我们很容易知道可以在哪些环节,以何种途径加入鼠标和键盘消息。

1.添加鼠标键盘消息的方法:
我们知道消息传递的路径,就很清楚可以在哪些环节把我们需要的键盘鼠标消息添加进去了。
1.1: Linux Driver 层面添加:
可以写一个Linux Driver,注册一个字符设备驱动程序,建立一个虚拟的字符设备,主设备号13。利用Ioctl()和应用程序沟通。
之前在Linux 2.4时代,Sam曾在S3C2440A上写过这样一个Driver,个人起名叫VInput。可以实现以上功能。
优点:很少。
缺点:
1.编程较为复杂。Linux Kernel从2.4到2.6,再到3.0。Kernel变动不小,仅字符设备驱动程序的注册方法和Device的建立方法都有不小的变化,devfs也不支持了。
2.需要有对应目标平台的Kernel Source Code。
3.需要有root权限,才能够insmod ko文件。

总结:这个方法并不好用。除了专业写Driver的朋友外,估计没有人会这么干。有一次曾想把Linux Kernel 2.4时代的VInput移植到Linux Kernel3.0来。但内核符号改变太大。没能实现。

1.2: Linux 用户层面添加:
在Linux Kernel 2.6的某个版本中,添加了UInput。即Input User level driver. 这个Driver允许应用程序通过和 /dev/uinput交互来创建一个新的Linux Input Device。 这个Device可以是Keyboard, Mouse,绝对位置设备等等。既然Linux 层面都模拟出具体设备了。则Framework更会认为这是个实实在在的输入设备。则我们模拟出的消息会一路上传,一直传递到App层面。
具体方法:
http://blog.sina.com.cn/s/blog_602f87700100llew.html

优点:
程序简单易行,不需要Kernel Source Code。可以模拟几乎一切常见的输入设备。
缺点:
这个程序最好是使用NativeC程序写成一个可执行程序。只在Linux层运行。
但如果才用JNI把它做成一个库,供上层Android程序调用。则有可能会遇到一个问题:权限不足。
我们在Android系统下常看到/dev/input设备的拥有者是system. 同组的其它用户的权限常常是不可读写。而一般的APK的拥有者并不是system, 所以无法读写这个设备(/dev/uinput). 所以此方法在JNI方式下有可能会失败。
除非/dev/uinput的权限是666. 则没有问题。
(当然也有两个办法突破,但那是另一个话题了, 可以看看以下文档系统签名部分:
http://blog.sina.com.cn/s/blog_602f87700101jm9b.html)

总结:这个方法Sam一直在实际使用。效果很不错。

1.3: Framework 层面修改:
这个办法只是理论上可行,可以在Framework 读取/dev/eventX 的JNI部分去下手。但实际上没有人会为了这个功能去破坏Framework的稳定。所以只是理论上可行。以前一个同事曾研究过这一块。但没有最终动手做。

总结:除非有特殊需求,否则不要这么做。

1.4: 利用Instrumentation发送键盘鼠标消息:
Instrumentation可以监听系统和应用程序之间的通讯。可以利用它给应用程序发送鼠标键盘消息。有点像Windows下的Hook。

具体方法:
如果仅想向本应用程序发送键盘鼠标消息。
Instrumentation inst=new Instrumentation();
inst.sendKeyDownUpSync(KeyEvent.KEYCODE_A);
inst.sendPointerSync(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN, 100, 200, 0));
SystemClock.sleep(1000);
inst.sendPointerSync(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN, 200, 200, 0));
SystemClock.sleep(1000);
inst.sendPointerSync(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_UP, 200, 200, 0));

发送键盘和鼠标消息给当前有焦点的窗口。
可以采用:
sendKeyDownUpSync()
sendKeySync()
sendCharacterSync()等方式发送键盘消息。

可以使用sendPointerSync()发送鼠标消息。

但如果想向其它App的窗口发送键盘鼠标消息。仅仅这样做就会出错,程序会Crash。
java.lang.SecurityException: Injecting to another application requires INJECT_EVENT permission.

好的,我们加上这个权限。
在AndroidManifest.xml 的Permissions选单中,添加Uses Permission.选中INJECT_EVENT.

此时 uses-permission android:name=”android.permission.INJECT_EVENT” 被加入。
但编译时会报错,这个权限仅有System APP才能拥有。
呵呵,那只好再加系统权限了。

android:sharedUserId=”android.uid.system”>
加入。
生成未签名的APK。 再使用apktools加上系统签名文件。这样,就可以向其它APP发送鼠标键盘消息了。

优点:简单易行。
缺点:如果向其它程序发送鼠标键盘,则需要系统签名文件。且一些程序估计从更底层拿消息,所以会产生在这类程序中无响应的情况。

总结:想向其它APP Window 发送消息。则一定需要系统签名。

总的看来,在Android系统中模拟鼠标键盘。采用UInput方案且在Linux层做NativeC可执行程序最为稳妥。在Linux层面就直接创建了输入设备。
如果采用Instrumentation方式,一方面一些APP可能不吃,另一方面,如果想向其它APP发送消息。则需要系统签名文件。

Android系统模拟鼠标键盘详解相关推荐

  1. Delphi下利用WinIo模拟鼠标键盘详解

    本文最早在编程论坛上发表,文章地址:http://programbbs.com/bbs/view12-17207-1.htm,相关文件可以在上述地址的页面中下载.转载时请注明出处. 前言 一日发现Se ...

  2. Android自定义控件进阶13-MotionEvent详解

    Android MotionEvent 详解,之前用了两篇文章 事件分发机制原理 和 事件分发机制详解 来讲解事件分发,而作为事件分发主角之一的 MotionEvent 并没有过多的说明,本文就带大家 ...

  3. Android 源码编译详解【合集篇】

    Android 源码编译详解[一]:服务器硬件配置及机型推荐 做 Android系统开发多年,开发环境都是入职就搭建好了,入职时拿个账号密码就直接开始搞开发了,年初换了新公司,所有的项目都是刚起步,一 ...

  4. android hid 编程,Android Bluetooth HID完成详解,androidhid

    Android Bluetooth HID完成详解,androidhid Android Bluetooth HID落实详解 Android 关于蓝牙的局部运用的是BlueZ协定栈.然而直到眼前2.3 ...

  5. android 按键用户点击事件,Android按键事件处理过程详解

    Android按键事件处理过程详解 (2013-09-26 14:05:19) 标签: it 在Android系统中,存在多种界面事件,如点击事件.触摸事件.焦点事件和菜单事件等,在这些界面事件发生时 ...

  6. Android Bluetooth HID实现详解

    Android Bluetooth HID实现详解 Android 关于蓝牙的部分使用的是BlueZ协议栈.但是直到目前2.3.3都没有扩展HID的profile,只是实现了最基本的Handset和d ...

  7. View的事件体系之三 android事件分发机制详解(下)

    接着上一篇来分析事件分发机制,在看了各位大牛的关于事件分发机制的分析后茅塞顿开,之前看过好几遍郭霖,弘扬以及玉刚大神关于事件体系的讲解,一直看不懂,比较模糊,最近复习时,看到一篇博文,写的相当精彩,看 ...

  8. android常用技术网站收藏过的网址 给 Android 开发者的 RxJava 详解 Android设备标识-没有完美的解决方案-只有取舍 - 小彼得的专栏 - 博客频道 - CSDN.NET

    收藏过的网址 http://www.jianshu.com/p/a7b36d682b6f?ref=myread  Android插件化快速入门与实例解析 http://www.cnblogs.com/ ...

  9. Android Activity 生命周期详解及监听

    前言 系列文章: Android Activity 与View 的互动思考 Android Activity 生命周期详解及监听 Android onSaveInstanceState/onResto ...

最新文章

  1. 用C语言实现 静态通讯录+动态通讯录+文件实现“退出保存信息版本”(附上思路+项目展示+源代码)
  2. 斑马技术发布《2022年中国医院愿景研究》:未来5年,超过90%的临床医生将采用移动技术...
  3. boost::hana::members用法的测试程序
  4. ThreadLocal - Java多线程编程
  5. 开学前要多为孩子健康做准备
  6. OpenCV实战1——图像矫正技术
  7. ajax判断网络中断,如何检测由于网络Ajax调用失败断开
  8. python微控制器编程从零开始 pdf_Python极客项目编程_(美)Mahesh Venkitachalam.pdf
  9. JavaScript 资源列表
  10. GC root 解决了循环引用的垃圾回收问题
  11. oracle-手动锁表
  12. keil 5 注册机使用及报错解决办法
  13. Displaytag的使用四
  14. 安卓如何隐藏root
  15. csdn七牛云存储作为网站的图片外链
  16. LTP学习笔记(基本安装+执行)
  17. javascript创建对象方法总结
  18. 无线衰落信道、多径与OFDM、均衡技…
  19. Idea报错[Cannot access com.xxx] 的 [解决办法]
  20. 文正教务系统微信开发

热门文章

  1. 巴菲特、索罗斯的投资名言
  2. 正态分布、正态分布采样及Python实现
  3. python画圆形螺旋线_用Python写一首中秋Rap
  4. VMware无法连接网络问题不显示网络连接
  5. Image.FLIP_LEFT_RIGHT将被弃用
  6. 关于Java项目中,word和Excel类型文件的预览功能实现
  7. (详细图示)IDEA彻底删除项目
  8. 华为鸿蒙路线图,华为鸿蒙 华为鸿蒙OS路线图公布:1.0版首发于智慧屏、2.0...
  9. 一个Hierarchical Attention神经网络的实现
  10. springboot配置mybatis逆向工程