如何在Android上将输入事件注入自己的应用程序?

我寻找一种方法,如何将触摸或键盘事件等输入事件从该特定应用程序中的代码注入到自己的应用程序中.不要进入
Android操作系统或其他应用程序需要签名级权限android.permission.INJECT_EVENTS或rooted设备,我必须避免这两者.我寻找一个在非root设备上运行的代码,但无论如何都没有提升权限.

我基于以下概念以某种方式在代码方面取得了一些进展:

View v = findViewById(android.R.id.content).getRootView();
v.dispatchTouchEvent(e);

最佳答案 我认为getRootView和发送它应该很好,如果有任何问题.请简单介绍一下.

或者有一个更高级别但很棘手的方法来做到这一点.
在View.java中,有一个名为getViewRootImpl()的隐藏api,它将返回此Activity的android.view.ViewRootImpl对象.并且有一个名为enqueueInputEvent(InputEvent event)的方法.这样你就可以使用反射来获得这个方法.

由于我刚刚完成了一个使用键盘向屏幕发送触摸命令的项目,我认为当您尝试将这些事件注入活动时,多次触摸可能是个问题.当您尝试将另一根手指发送到屏幕时.事件操作必须是ACTION_POINTER_DOWN,其中包含名为properties的数组的索引移位.此外,您还应该处理属性和坐标数组,其中包括每次所有手指的信息,即使您此时只需要移动一根手指.手指的id设置为properties [i] .id用于识别您的手指.但是数组的索引并不牢固.

        for (int i = 0; i < size; i++) {
            properties[i].id = fingerId;
            properties[i].toolType = MotionEvent.TOOL_TYPE_FINGER;

            coordses[i].x = currentX;
            coordses[i].y = currentY;
            coordses[i].pressure = 1;
            coordses[i].size = DEFAULT_SIZE;
        }
        event = MotionEvent.obtain(
                    mDownTime, SystemClock.uptimeMillis(),
                    ((size - 1) << MotionEvent.ACTION_POINTER_INDEX_SHIFT)
                            + MotionEvent.ACTION_POINTER_DOWN,
                    size,
                    properties, coordses, DEFAULT_META_STATE, DEFAULT_BUTTON_STATE,
                    DEFAULT_PRECISION_X, DEFAULT_PRECISION_Y, DEFAULT_DEVICE_ID,
                    DEFAULT_EDGE_FLAGS, InputDevice.SOURCE_TOUCHSCREEN, DEFAULT_FLAGS);
点赞