我想开发一个移动应用程序,用于存储所有用户操作,例如点击,选择,滑动和关闭应用程序到数据库中。我必须存储按钮名称,id和操作时间。
如何在不影响正在运行的其他应用的情况下在Android中跟踪该内容?
答案 0 :(得分:1)
没有本地方法可以做到这一点,因为暴露一个(简单)API来实现这一点将允许太多人轻松跟踪用户的操作,包括他们在(虚拟)键盘上键入的密码,所以这提出了真正的安全问题。假设您开发的应用程序将此跟踪作为其主要目的(而非背景“附加”非广告跟踪),这不是一个问题。
通过使用叠加层可以捕获某些事件而不会干扰其他活动。在您创建捕获窗口的Service
中,使用TYPE_SYSTEM_OVERLAY
将其指定为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:你不能。