我想开发一个移动应用程序,将所有用户操作(如单击、选择、滑动和关闭应用程序)存储到数据库中。我必须存储按钮名称、ID 和操作时间。
如何在 Android 中跟踪它而不干扰正在运行的其他应用程序?
我想开发一个移动应用程序,将所有用户操作(如单击、选择、滑动和关闭应用程序)存储到数据库中。我必须存储按钮名称、ID 和操作时间。
如何在 Android 中跟踪它而不干扰正在运行的其他应用程序?
没有本地方法可以做到这一点,因为公开(简单的)API 会允许太多人轻松跟踪用户的操作,包括他们在(虚拟)键盘上键入的密码,所以这构成了一个真实的安全问题。假设您开发的应用程序将此跟踪作为其主要目的(而不是作为背景“附加”非广告跟踪),这不是一个问题。
通过使用覆盖,可以在不干扰其他活动的情况下捕获一些事件。在您Service
创建捕获窗口的位置中,将其指定为TYPE_SYSTEM_OVERLAY
with FLAG_WATCH_OUTSIDE_TOUCH
:
mView = new TouchCaptureView(this);
WindowManager.LayoutParams params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL |
WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,
PixelFormat.TRANSLUCENT);
WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
wm.addView(mView, params);
然后覆盖您的触摸捕获视图onTouchEvent
以记录MotionEvent
数据库中的每一个。但是,这不允许您知道用户实际单击了什么,它可能是按钮、复选框等,并且无法知道(加上控件可能是自定义实现)。确定最终的操作是不可能的,因为应用程序不会将用户的操作广播到其他应用程序。此外,从 Android 4.0 开始,覆盖窗口不再捕获事件,TYPE_SYSTEM_ALERT
但仍然会干扰其他活动。
TL;DR:你不能。