正如标题所说,在我的研究中,我需要记录用户触摸屏事件,主要是用户使用其他应用时的手势(如点按,滚动,滑动等)。目前,我无法找到一种好方法。对于Android 4.x来说,触摸屏事件似乎无法读出?任何人都知道捕捉触摸事件的任何好方法吗?
答案 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中滚动并没有产生任何事件)。
话虽如此,如果您的应用程序可以依赖于有根的解决方案,那么它可以收听来自getevent
(https://source.android.com/devices/tech/input/getevent.html)的传入行。这些行只是提供触摸(和其他)事件的详细信息。但这需要root访问权限,因此可能不是一个可接受的解决方案。
答案 2 :(得分:0)
我认为你应该已经找到了这个,但它可能会"是唯一可以帮助您的图书馆,因为出于安全和隐私原因,您无法直接在活动之间进行互动:
答案 3 :(得分:0)
不确定是将此作为评论或答案发布,但我怀疑由于安全问题,这不应该是可能的。如果您可以监视其他应用程序中的活动,而不会对用户显而易见,则可能会不恰当地将密码输入监视到其他应用程序中。因此,如果不支持这种活动,我不会感到惊讶。
答案 4 :(得分:0)
正如amarnathpatel所说,几乎不可能在没有root的情况下获得触摸事件。但是我们可以通过锻炼来获取事件而不是协调者。这是使用FLAG_WATCH_OUTSIDE_TOUCH完成的。 check this out