如何从后台服务记录活动上的所有触摸事件 [英] How to log all touch event on an Activity from a background service
问题描述
我需要记录一个活动中的所有接触点,因此我在窗口管理器中添加了一个覆盖视图,并在覆盖视图上设置了触摸侦听器,我得到了所有接触点,但是添加覆盖后我面临两个问题
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
- 我可以打开选项菜单,但不能选择任何菜单项
- 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屋!