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

Ale*_*ska 5 android

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

我在使用基于以下概念的代码方面取得了一些进展:

View v = findViewById(android.R.id.content).getRootView();
v.dispatchTouchEvent(e);
Run Code Online (Sandbox Code Playgroud)

小智 1

我认为 getRootView 和调度它应该工作得很好,如果有任何问题的话。请简单介绍一下。

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

由于我刚刚完成了一个使用键盘向屏幕发送触摸命令的项目,我认为当您尝试将此类事件注入到活动中时,多次触摸可能会成为问题。当您尝试将另一根手指移到屏幕上时。事件操作必须是 ACTION_POINTER_DOWN ,并带有名为 property 的数组的索引移位。而且您还应该处理属性和坐标数组,其中每次都包含所有手指的信息,即使此时您只需要移动一根手指。设置为properties[i].id的手指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);
Run Code Online (Sandbox Code Playgroud)