我正在尝试创建一个应用程序,该应用程序将在后台运行一个能够将触摸屏事件注入任何正在运行的活动的服务.我可以通过调用将事件注入到我的应用程序的一部分Activity中Instrumentation.sendPointerSync(motionEvent);但是如果我尝试在没有运行应用程序的活动的情况下执行此操作,则会收到权限错误,说我没有INJECT_EVENTS权限.我已将此权限添加到我的清单中,但是<uses-permission android:name="android.permission.INJECT_EVENTS"></uses-permission>它仍然会抛出相同的权限异常.经过一些搜索,我得到了答案,为了获得INJECT_EVENTS权限,您的应用必须使用与系统签名相同的签名进行签名.但我不清楚这究竟是什么意思.我将不得不找到一个自定义rom构建它并使用与该应用程序签名相同的签名对其进行签名.然后在我的设备上安装自定义ROM,然后安装我的应用程序,我将能够正确地注入触摸事件?如果是这样的话是我最好与已放在一起,就像一个自定义ROM开始从该页面或者是我要去的地方需要抢Android项目的git的副本,并建立整个事情的情况myslef?无论哪种方式,任何人都知道你可以指向我的地方,这会让我朝着正确的方向努力实现这一目标吗?
想象一下,我有一个从蓝牙设备接收坐标的服务,现在我想在鼠标移动时显示鼠标光标。
我设法使用 toolType = TOOL_TYPE_MOUSE 发送 MotionEvents,但我没有在屏幕上显示本机 android 鼠标光标。
我发送的事件如下所示:
05-14 13:38:05.043: I/onTouchEvent(30301): MotionEvent { action=ACTION_DOWN, id[0]=0, x[0]=498.0, y[0]=996.0, toolType[0]=TOOL_TYPE_MOUSE, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=251957430, downTime=251957420, deviceId=1, source=0x2002 }
Run Code Online (Sandbox Code Playgroud)
我正在像这样创建它们:
public void moveMouse(int x, int y) {
// Obtain MotionEvent object
long downTime = SystemClock.uptimeMillis() - 10;
long eventTime = SystemClock.uptimeMillis();
int metaState = 0;
MotionEvent.PointerProperties p = new PointerProperties();
p.toolType = MotionEvent.TOOL_TYPE_MOUSE;
p.id = 0;
MotionEvent.PointerProperties[] properties = {p};
MotionEvent.PointerCoords c = new MotionEvent.PointerCoords();
c.x = x; …Run Code Online (Sandbox Code Playgroud)