我正在寻找一种方法,如何从特定应用程序中的代码将触摸或键盘事件等输入事件注入(inject)到自己的应用程序中。 NOT 进入 Android 操作系统或其他需要签名级权限 android.permission.INJECT_EVENTS 或 root 设备的应用程序 b/c,我必须避免这两种情况。我正在寻找一种在没有任何提升权限的情况下在非 root 设备上运行的代码。
我在基于以下概念的代码方面取得了一些进展:
View v = findViewById(android.R.id.content).getRootView();
v.dispatchTouchEvent(e);
最佳答案
我认为 getRootView 和 dispatch 它应该运行良好,如果有任何问题的话。请简单介绍一下。
或者有一个更高层次但更棘手的方法来做到这一点。 在 View.java 中,有一个名为 getViewRootImpl() 的隐藏 api,它将返回此 Activity 的 android.view.ViewRootImpl 对象。并且它上面有一个名为 enqueueInputEvent(InputEvent event) 的方法。这样就可以使用反射来获取这个方法。
由于我刚刚完成了一个使用键盘向屏幕发送触摸命令的项目,我认为当您尝试将此类事件注入(inject) Activity 时,多点触摸可能会成为问题。当您尝试将另一根手指放在屏幕上时。事件 Action 必须是 ACTION_POINTER_DOWN,带有名为属性的数组的索引移位。而且你还应该处理属性和坐标数组,其中包括每次所有手指的信息,即使你此时只需要移动一根手指。设置为 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);
关于android - 如何在 Android 上将输入事件注入(inject)自己的应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40440209/