开篇先说些废话,提醒自己,因为每次都给自己找理由。在碰到并解决一些问题的时候完全可以记录下来,方便自己查看,也可以让碰到同样问题的人找到,免得再走些弯路,但是,老是以正在朝着目标迈进,时间紧,没法整理,其实完全没有必要;而且现在想想其中的曲折,都已经忘了。所以赶紧补上些。
这篇主要介绍了些实现Android按键的监听与模拟的思路,自己只是部分实现了后面最简单快速的方式,其它方式有待进一步分析实践,但是要根据需要,不要盲目。同时,把一些碰到的问题也一同加上,供以后参考解决。自己的思路是在网上很多讨论中得到的想法,因此如果有足够的时间或者对其中部分很熟悉的话可以顺着去做。
1.Android模拟键盘和键盘监听的一些调研 详解
网址:http://www.bangchui.org/read.php?tid=11672
(1)按键监听
这篇帖子中针对按键的产生及响应作了简要分析,当然是在上层的,没有涉及到内核。结论是:“Android的按键产生的是一个KeyEvent,这个KeyEvent只能被最上层获得焦点窗口的activity和view得到,无法被其他进程获得,进程间的键盘监听是无法实现的。”但是其中提到了一个监听按键的思路,可以把自己的程序伪装成输入法,在记录按键后,再调用真正的输入法(或者集成到自己的程序里),这个对于输入法没有概念的人似乎需要花些时间来研究。
(2)按键模拟
帖子中提出一种可以实现的情况是在源码环境下调用IWindowManager来实现,我记得在一篇博文里也看到过说是源码环境下编译实现,但是真的测试使用不知道情况怎么样;帖子中提出的另一种方法还是接着上面的输入法方式;而后大部分篇幅介绍了用于测试的sendkeyevent等相关方法,但是记得好像只能针对指定应用程序。记得官网中说到的Monkey和monkeyrunner,也是有发送按键消息的,但是有限制。这里面的全面的按键模拟与监听的实现有待验证。
2.Webkey
一般常见的软件是Android手机远程控制PC,但是换个思路,PC远程登录手机呢?一旦登录,必然涉及到按键的模拟等操作。于是找到两个开源的软件一个是SmartDog Studio的Remote Control Add-on,从Android Market上看到他更新的还是不错的,但是始终没有找到它的源码能从哪里下载到,给定的网站可能是被墙了,我进不去。另一个是Webkey,个人使用了,获得的手机页面颜色不好,但是按键等操作确实可以实现远程控制,而且是可以直接通过浏览器上来完成,免去了装其它VNC软件了。简单查看了它的实现,不管其简单的httpserver,只关注模拟按键,发现其按键的实现是通过对"/dev/uinput"或"/dev/input/uinput"的写入操作来实现的。但是涉及到设备文件的创建,对Linux中按键的监听与模拟,因此对Linux熟悉的人可以尝试着去做,而且既然人家的能控制,那么这种方式应该肯定能实现的。其中有个问题是必须要有root权限,因为,底层的那些代码用JNI调用肯定权限不够的,因此人家应该是在Linux环境下利用NDK提供的交叉编译器编译好后,在手机中root权限下直接后台执行的。
3.命令行监听与模拟
上面两种方式算是一个从上层应用的角度和一个从底层Linux角度来做,那么应该就有折中的方案。一方面可以去看Monkey和monkeyrunner的实现方式寻找答案,另一方面在linux本身的命令行中寻找。是的,作为Shell中可以执行的命令getevent sendevent在这里起到了非常大的作用。文章《Android自动化测试之Shell脚本一——模拟触屏事件》算是做了个非常好的交代,而且《Android 【真机】与【模拟器】触摸屏事件的模拟差异分析》这篇文章很好的说明了一些问题。这样根据两者的结合,初步可以做到在shell下按键的监听与模拟,当然是需要root权限的。但是这里面又涉及到如果直接做成软件,在运行环境中的执行,对于真机和模拟器又会有一系列问题,我只能说真机的问题解决简单一些,模拟器的似乎有些莫名其妙,我只是部分实现了这一过程,对于详细的做法,真正需要的人再研究和讨论吧,免得被人做成了木马,就。。。。。。
最后还要提的是另一种想法,就是有说Android的执行权限有问题,如果直接编写Java代码或者C代码可以绕过权限,不过我不知道说这些的人具体测试的情况怎么样,但是按照我的理解,对于那些不需要root权限的权限,似乎影响不大,你绕过了也无所谓,人家只是为了方便给用户提醒,但是真的需要root权限的,你应该绕不过去吧,因为至少你的uid跑不了,难道也在源码下用和系统进程相同的?
由于时间仓促,我没有深入的去分析linux下按键的监听与模拟,如果在Linux可以的话,那在Android上(实际还是Linux上)应该也是可以的。好了,写到这里,有问题的可以留言讨论了。
上面提到的文章链接:
[1]Android模拟键盘和键盘监听的一些调研 详解 http://www.bangchui.org/read.php?tid=11672
[2]Android自动化测试之Shell脚本一——模拟触屏事件 http://guolin.guosfamily.com/2012/02/15/android-automated-test-by-shell-touch-event/
[3]Android 【真机】与【模拟器】触摸屏事件的模拟差异分析 http://blog.csdn.net/yiyaaixuexi/article/details/6574001
分享到:
相关推荐
标题“android 通过AccessibilityService实现系统按键监听”指出我们要讨论的是如何利用 AccessibilityService 来监听并响应系统的按键事件。这通常涉及到Android系统的底层交互和事件处理机制。以下将详细介绍如何...
通过学习这个示例,开发者可以更好地理解和应用媒体键的监听与模拟,提高应用程序的用户体验,尤其是对于音乐播放、视频播放等多媒体应用来说,这类功能尤为重要。 总之,Android的媒体键监听和模拟媒体键盘是提升...
在Android系统中,AccessibilityService是一种特殊的服务,它允许应用程序获取并响应用户与系统的交互,包括触摸事件、键盘事件等。这种服务主要用于帮助残障人士,提供无障碍功能,但也可以被开发者用于实现特定的...
在Android开发中,有时我们需要模拟按键事件,例如创建一个手机遥控器应用,就需要在不同的进程中发送按键事件。本文将详细讲解如何实现Android跨进程模拟按键(KeyEvent)。 首先,我们来看一个基本的发送按键事件...
在Android开发中,有时我们需要在程序中模拟按键事件,例如在自动化测试、游戏控制或特殊功能实现时。本文将深入探讨如何在Android代码中模拟按键事件,以按数字键1为例,并扩展到如何响应电源键事件使系统进入待机...
1. **按键模拟点击原理**:在Android系统中,通过发送MotionEvent对象到View或者Activity,可以模拟用户触摸屏幕的效果。通常,我们通过调用`dispatchTouchEvent()`或`onTouchEvent()`方法来处理这些模拟的点击事件...
通过理解并熟练运用Android的事件监听机制,开发者可以创建出更丰富、更具交互性的应用,如模拟飞行游戏中的飞机操控,或者其他需要精确用户输入的应用场景。不断探索和实践,是提升Android开发技能的关键。
可以使用`Robolectric`这样的测试框架,它可以模拟Android运行时环境,使得测试能在JVM上运行,无需真实设备。 3. **验证结果**:一旦点击事件被触发,我们需要验证它是否正确执行了预期操作,例如更新UI、启动新的...
通过这个“Android电话拨号带按键声demo”,开发者可以学习到Android中与UI交互、音频处理、权限管理等相关知识,这对于构建更复杂的Android应用具有很大的帮助。同时,这个demo也可以作为教学素材,帮助初学者快速...
虽然它主要与触摸事件相关,但也可以通过模拟坐标点的触控动作来模拟按键。例如,你可以创建一个`MotionEvent`对象,然后将其传递给`View`的`onTouchEvent`方法。这通常用于模拟屏幕上的点击操作: ```java View ...
在这个"android listView 模拟物理分页Demo 按键"项目中,开发者通过按键实现了分页加载数据的功能,以便用户逐步查看大量内容,避免一次性加载所有数据导致的性能问题。这个Demo适合初学者学习如何在ListView中实现...
本篇将详细介绍如何模拟Android设备上的长按Home键操作以及弹出近期任务的实现方法。 首先,理解Android系统的广播机制是关键。当用户执行一个动作,如按下或长按Home键,系统会发送一个对应的Broadcast Intent。...
在Android平台上,有时候我们需要实现自动化的屏幕操作,例如游戏挂机、自动化测试等,这就需要用到模拟屏幕点击的技术。本项目“android模拟屏幕点击”利用了Android的无障碍服务(Accessibility Service)和悬浮窗...
本项目"Android键盘监控源码,检测按键"提供了一种方法来捕获和分析Android设备上的实体键盘输入。下面将详细介绍这个项目及其相关知识点。 一、Android权限与API接口 在Android中,为了监听键盘事件,开发者需要...
1. 添加按键监听器: 要监听外部按键,我们需要在Activity中重写`onKeyDown()`和`onKeyUp()`方法。这两个方法会在按键按下和释放时分别被调用。例如: ```java @Override public boolean onKeyDown(int keyCode, ...
本主题将探讨如何利用TextView来模拟按键效果,为用户提供交互式的菜单体验。在创建这样的菜单时,我们通常会关注布局的设计,包括顶部(top)、主体(body)和底部(bottom)三个关键区域。 首先,我们要理解布局...
一、Android按键基础 Android系统的按键操作主要分为软键(如虚拟按键)和硬键(物理按键)。理解这些按键的工作原理,包括它们在硬件层面的信号传递和软件层面的事件处理,是进行按键修改或添加的前提。 二、按键...
使用C/C++进行Android Native开发(NDK)时,可以使用JNI(Java Native Interface)与Java层交互,实现跨层的用户输入记录和模拟功能。通过JNI,Native代码可以调用Java方法,反之亦然,使得在底层处理输入事件成为...
这份“安卓Android源码——按键的处理.zip”压缩包可能包含了关于Android系统如何管理和响应硬件按键以及软件模拟按键的源代码分析。让我们深入探讨一下这个主题。 首先,Android系统的按键处理主要分为两个层次:...