我寻找一种方法,如何从该特定应用程序中的代码中将输入事件(例如触摸或键盘事件)注入到自己的应用程序中。不要进入需要签名级权限 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)
| 归档时间: |
|
| 查看次数: |
1389 次 |
| 最近记录: |