如何从后台服务记录活动上的所有触摸事件 [英] How to log all touch event on an Activity from a background service

查看:43
本文介绍了如何从后台服务记录活动上的所有触摸事件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要记录一个活动中的所有接触点,因此我在窗口管理器中添加了一个覆盖视图,并在覆盖视图上设置了触摸侦听器,我得到了所有接触点,但是添加覆盖后我面临两个问题

I need to record all touch points in an activity so I have added an overlay view in window manager and set the touch listener on the overlay view and I am getting all touch point but I am facing two issues after adding the overlay

  1. 我可以打开选项菜单,但不能选择任何菜单项
  2. AlertDialog.show()停止显示警报框我可以通过覆盖活动中的onTouchEvent方法来获取所有接触点,但应用程序要求不允许这样做.

如果有人可以帮助我或者分享一些有关WindowManager,window和DecorView等的链接,这将是很棒的.这是我的代码,如果需要更多信息,请告诉我.

It will be great if any one can help me in this or share some link which explains about WindowManager, window and DecorView etc . here is my code, please let me know if more information is required.

 WindowManager.LayoutParams params = new WindowManager.LayoutParams(
    WindowManager.LayoutParams.MATCH_PARENT,
    WindowManager.LayoutParams.MATCH_PARENT,
    WindowManager.LayoutParams.TYPE_PHONE,
    WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
            | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
            | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,
    PixelFormat.TRANSLUCENT);


WindowManager wm = (WindowManager) activityContext
    .getSystemService(Context.WINDOW_SERVICE);

View mView = new View(activityContext);

wm.addView(mView, params);

mView.setOnTouchListener(new OnTouchListener() {

@Overrideenter code here
public boolean onTouch(View v, MotionEvent event) {
    Log.d("touch", "event occured");
    activity.getWindow().superDispatchTouchEvent(event);    
 // or   
   // activity.dispatchTouchEvent(event);

 return false;
}
});

推荐答案

最后,我通过对窗口的活动设置回调来实现了

finally I did it by setting a callback on window's activity

android.view.Window.Callback mCallBack = activity.getWindow().getCallback();

activity.getWindow().setCallback(new MyWindowCallBacks(mCallBack, act)); 

这是我的MyWindowCallBacks类

and here is my MyWindowCallBacks class

public class MyWindowCallBacks implements Window.Callback {
        private Window.Callback mCallBack;
        private Activity mActivity;

        public MyWindowCallBacks(Window.Callback mCallBack, Activity mActivity) {
            this.mCallBack = mCallBack;
            this.mActivity = mActivity;
        }

        @Override
        public boolean dispatchGenericMotionEvent(MotionEvent event) {

            return mCallBack.dispatchGenericMotionEvent(event);
        }

        @Override
        public boolean dispatchKeyEvent(KeyEvent event) {

            return mCallBack.dispatchKeyEvent(event);
        }

        @Override
        public boolean dispatchKeyShortcutEvent(KeyEvent event) {

            return mCallBack.dispatchKeyShortcutEvent(event);
        }

        @Override
        public boolean dispatchPopulateAccessibilityEvent(
                AccessibilityEvent event) {

            return mCallBack.dispatchPopulateAccessibilityEvent(event);
        }

        @Override
        public boolean dispatchTouchEvent(MotionEvent event) {

          // Here I can get all touch events

            return mCallBack.dispatchTouchEvent(event);
        }

        @Override
        public boolean dispatchTrackballEvent(MotionEvent event) {

            return mCallBack.dispatchTrackballEvent(event);
        }

        @Override
        public void onActionModeFinished(ActionMode mode) {

            mCallBack.onActionModeFinished(mode);
        }

        @Override
        public void onActionModeStarted(ActionMode mode) {

            mCallBack.onActionModeStarted(mode);
        }

        @Override
        public void onAttachedToWindow() {

            mCallBack.onAttachedToWindow();
        }

        @Override
        public void onContentChanged() {

            mCallBack.onContentChanged();
        }

        @Override
        public boolean onCreatePanelMenu(int featureId, Menu menu) {

            return mCallBack.onCreatePanelMenu(featureId, menu);
        }

        @Override
        public View onCreatePanelView(int featureId) {

            return mCallBack.onCreatePanelView(featureId);
        }

        @SuppressLint("MissingSuperCall")
        @Override
        public void onDetachedFromWindow() {


            mCallBack.onDetachedFromWindow();
        }

        @Override
        public boolean onMenuItemSelected(int featureId, MenuItem item) {

            return mCallBack.onMenuItemSelected(featureId, item);
        }

        @Override
        public boolean onMenuOpened(int featureId, Menu menu) {

            return mCallBack.onMenuOpened(featureId, menu);
        }

        @Override
        public void onPanelClosed(int featureId, Menu menu) {

            mCallBack.onPanelClosed(featureId, menu);
        }

        @Override
        public boolean onPreparePanel(int featureId, View view, Menu menu) {

            return mCallBack.onPreparePanel(featureId, view, menu);
        }

        @Override
        public boolean onSearchRequested() {

            return mCallBack.onSearchRequested();
        }

        @Override
        public void onWindowAttributesChanged(LayoutParams attrs) {

            mCallBack.onWindowAttributesChanged(attrs);
        }

        @Override
        public void onWindowFocusChanged(boolean hasFocus) {

            mCallBack.onWindowFocusChanged(hasFocus);
        }

        @Override
        public ActionMode onWindowStartingActionMode(Callback callback) {

            return mCallBack.onWindowStartingActionMode(callback);
        }

    }

这篇关于如何从后台服务记录活动上的所有触摸事件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆