gpt4 book ai didi

android - 如何从后台服务记录 Activity 上的所有触摸事件

转载 作者:太空宇宙 更新时间:2023-11-03 12:07:16 24 4
gpt4 key购买 nike

我需要记录一个 Activity 中的所有触摸点,所以我在窗口管理器中添加了一个覆盖 View ,并在覆盖 View 上设置了触摸监听器,我得到了所有触摸点,但在添加覆盖后我遇到了两个问题

  1. 我可以打开选项菜单但无法选择任何菜单项
  2. AlertDialog.show() 停止显示警告框我可以通过重写 Activity 中的 onTouchEvent 方法来获取所有接触点,但应用要求不允许这样做。

如果有人能在这方面帮助我或分享一些解释 WindowManager、window 和 DecorView 等的链接,那就太好了。这是我的代码,如果需要更多信息,请告诉我。

 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;
}
});

最佳答案

最后我通过设置窗口 Activity 的回调来做到这一点

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

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

这是我的 MyWindowCallBacks 类

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);
}

}

关于android - 如何从后台服务记录 Activity 上的所有触摸事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26361802/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com