在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. Android 模拟屏幕点击和物理按键方式

    在Android 中,有些特定的功能或者在调试的时候需要模拟屏幕点击功能和物理按键等. 在实现上有2种方式: 首先是模拟屏幕点击的实现方式有两种: 模拟屏幕点击 本进程内实现,就是只有在自己的app上 ...

  2. Android模拟屏幕点击input tap替代解决方案

    动机解释 本来直接使用 adb shell -> input 即可模拟 键盘事件,触屏事件keyevent ,text,tap  但是手上的这台目标Android机4.0.3系统的input只支 ...

  3. android 模拟屏幕点击

    工作中有一个界面刚进入时要弹出一个popupwindow,里面有键盘,结果直接模拟点击事件不起作用,还报错, 12-26 17:01:08.636: D/CrashHandler(1795): and ...

  4. Android模拟屏幕点击,滑动等事件

    模拟事件全部是通过input命令来实现的,首先看一下input命令的使用: usage: input ... input text <string>        input keyeve ...

  5. android 模拟键盘鼠标

    1,新建一个android 项目 2,新建主activity类 package test.yutel;import android.app.Activity; import android.os.Bu ...

  6. 【Android】技术调研:用代码模拟屏幕点击、触摸事件

    在Android中,有些场景需要使用代码来模拟人的操作,比如微信自动抢红包.UI测试等都需要模拟实现点击事件(Click).触摸事件(Touch).键盘事件(KeyBoard)等.那么,有没有现成的方 ...

  7. android 模拟点击 不发出声音,【Android】代码实现模拟屏幕点击和键盘按键事件...

    最近参加某比赛写了一个Android手机控制Android电视的程序,其中需要控制电视端模拟"鼠标"点击,和模拟按键盘的事件. 下面直接贴上程序: // 模拟屏幕点击事件 publ ...

  8. android模拟鼠标点击事件给控件,Android使用模拟鼠标拖动操作

    将远程控制支持添加到android2.2版本. 此处的看起来与电视所使用的相似,不同之处在于它具有比电视更多的自定义功能按钮. 单击上的切换按钮,当切换到鼠标模式时,在android视图上绘制类似鼠标 ...

  9. 蓝牙键盘 android手机游戏,使用BluetoothHidDevice将安卓手机同时模拟成鼠标和键盘...

    一直以来就有一种想法,就是自己写一个APP将安卓手机模拟成鼠标/键盘,应急的时候可以用来代替鼠标/键盘.之前也在国内外的网站上找了各种方案,但是这些方案不是很好,直到谷歌发布的API28后终于有了很好 ...

最新文章

  1. 入行时间序列预测必读的4篇论文(附代码)
  2. python requests库用法_python之requests库的使用
  3. 工作中常用的 6 种设计模式!
  4. phpcms前台注入导致任意文件读取漏洞
  5. 68. 使用Apache的rewrite技术
  6. 贴张我家养的狗狗们的照片!
  7. Android12及所有版本解决没有system读写权限(只需要magisk面具)
  8. 2.4G有源RFID数据读取实验
  9. 计算机运行很卡很慢,PS打开很卡怎么办?电脑太老PS运行慢如何优化?
  10. 设置Chrome忽略网站证书错误
  11. 【DeeplabV3+ MIoU】DeeplabV3+计算评价指标
  12. 深入理解java虚拟机(六)GC垃圾回收-低延迟垃圾收集器(Shenandoah、ZGC)
  13. 信号处理趣学D0——系列专栏的说明与目录
  14. 我的世界服务器拔刀修复,我的世界拔刀剑怎么修复武器攻略分享
  15. 关于meta: description HTML 标签的解释 ,SEO
  16. js制作的模拟超逼真下雨效果
  17. 计算机网络知识全面讲解:电子邮件发送和接收的过程
  18. JQuery极果商城项目实战(附完整代码)
  19. 小程序 点击图片放大预览
  20. 设置电脑主机ip地址

热门文章

  1. dns随笔(部分转载)
  2. 奇怪的报错(uncaught typeerror illegal invocation)
  3. android 辅助功能 模拟点击,Android模拟点击的四种方式
  4. 从安装包中提取wear OS手表端应用
  5. Android 下拉选择框自定义view
  6. 企业短视频团队运营策划工作SOP方案计划表
  7. Java 正则表达式 手机号 身份证号脱敏
  8. 【0-1背包】二进制灰狼算法解决0-1背包问题【Matlab】
  9. Java中使用HSSFWorkbook POI导出下载excel文件
  10. 禁用linux系统日志,清除linux系统日志,禁用linux系统日志,删除linux日志