如何创建一个Android应用程序,可以在用户使用其他应用程序时捕获全局触摸屏事件?

时间:2014-04-22 13:53:29

标签: android

正如标题所说,在我的研究中,我需要记录用户触摸屏事件,主要是用户使用其他应用时的手势(如点按,滚动,滑动等)。目前,我无法找到一种好方法。对于Android 4.x来说,触摸屏事件似乎无法读出?任何人都知道捕捉触摸事件的任何好方法吗?

5 个答案:

答案 0 :(得分:4)

我还在很长一段时间内在R& D上进行研发,以便在ANDROID应用程序中获取全局触摸事件。

实际上我们的要求是从ANDROID应用程序中捕获手机上的触摸坐标。

我们尝试了几种方法:

1-首先,我们尝试在手机屏幕上方放置透明布局(如手机屏幕上方的一层玻璃),然后接收触摸事件并动态移除玻璃,以便将事件传递到下方玻璃然后再次动态插入玻璃。 但缺点是它需要两次敲击这是不可行的(因为第一次敲击会给出触摸坐标,第二次接触会在玻璃下方通过)。

2-然后我们尝试在窗口管理器中使用一个特殊标志,即flag_watch_outside_touch,使透明布局大小为1 X 1,但我们得到的触摸坐标为(0,0),因为Android Framework强加了其他进程无法获得的安全性其他过程中的接触点。

3-然后我们尝试运行命令" adb shell getevents"通过代码,但它不接受触摸事件(虽然通过使用" adb shell sendevent"我们能够发送全局触摸事件,即通过传递一个坐标,我们能够在设备屏幕上的特定坐标上传递事件

4-现在我们非常确定没有root,没有App可以获得将在其他应用程序进程中发生的全局触摸事件。 Android安全性不允许这样,否则任何应用都可以使用密码或其他用户输入数据。

但是......我们必须这样做(没有生根)......

5-现在我们尝试使用shell脚本并从命令提示符执行getevent命令,并将触摸事件重定向到文件并解析触摸事件以获得可读的坐标..

因此我们无法通过代码捕获应用程序内的全局touchevents,但是我们可以通过从adb shell执行getevent命令从操作系统级别捕获。 我们可以通过将其存储到手机存储中的外部存储器来传递给Android应用程序。

希望这对你们有所帮助。

谢谢,

答案 1 :(得分:3)

由于安全和隐私原因(如SC爵士提到的),这是不可能的,除非你已经扎根。

我尝试了很多东西(甚至在Stackoverflow上问了一个问题:Android - Inactivity/Activity regardless of top app)。我得出结论,使用"辅助服务"是用户触摸屏幕时最接近我们知道的。然而,这并非傻瓜式的证据。每次屏幕触摸都不会得到一个事件(在Chrome中滚动并没有产生任何事件)。


话虽如此,如果您的应用程序可以依赖于有根的解决方案,那么它可以收听来自geteventhttps://source.android.com/devices/tech/input/getevent.html)的传入行。这些行只是提供触摸(和其他)事件的详细信息。但这需要root访问权限,因此可能不是一个可接受的解决方案。

答案 2 :(得分:0)

我认为你应该已经找到了这个,但它可能会"是唯一可以帮助您的图书馆,因为出于安全和隐私原因,您无法直接在活动之间进行互动:

GitHub android-global-touchevent

答案 3 :(得分:0)

不确定是将此作为评论或答案发布,但我怀疑由于安全问题,这不应该是可能的。如果您可以监视其他应用程序中的活动,而不会对用户显而易见,则可能会不恰当地将密码输入监视到其他应用程序中。因此,如果不支持这种活动,我不会感到惊讶。

答案 4 :(得分:0)

正如amarnathpatel所说,几乎不可能在没有root的情况下获得触摸事件。但是我们可以通过锻炼来获取事件而不是协调者。这是使用FLAG_WATCH_OUTSIDE_TOUCH完成的。 check this out