我有一个系统应用程序(使用平台密钥签名),这个应用程序正在注入事件。它正在使用uinput
并尝试使用/dev/input/eventN
(其中N
是一个数字)。
如果我以root身份运行代码(即使用su
),代码显然可以打开/dev/input/eventN
并可以在那里注入事件。如果代码是从系统应用运行的,那么在使用permission denied
打开/dev/input/eventN
时,我会获得open("/dev/input/event1", O_RDWR)
。然而,即使在系统应用程序中,Uinput工作正常。
系统应用程序请求的权限是:
<uses-permission android:name="android.permission.READ_FRAME_BUFFER"
tools:ignore="ProtectedPermissions"/>
<uses-permission android:name="android.permission.ACCESS_SURFACE_FLINGER"
tools:ignore="ProtectedPermissions"/>
<uses-permission android:name="android.permission.INJECT_EVENTS"
tools:ignore="ProtectedPermissions"/>
<uses-permission android:name="android.permission.BIND_INPUT_METHOD"
tools:ignore="ProtectedPermissions"/>
对于它的价值,这个系统应用程序也会读取屏幕,并且能够这样做。所以很奇怪它无法用r / w /dev/input/eventN
打开。
如果可行的话,您可能想知道uinput
有什么问题。 uinput
的问题在于我在注入触摸事件时遇到问题。具体来说,我不能点击&#34; (TAP)。我可以拖动,滑动,注入键盘事件,但点击(点击)只是不起作用。看起来似乎长时间停滞不前。它没有注册最终事件,其中ABS_MT_TRACKING_ID
设置为0xffffffff
。
我用于&#34;点击&#34;的代码(点击)是:
// pointer down
send_event(EV_ABS, ABS_MT_SLOT, 0);
send_event(EV_ABS, ABS_MT_TRACKING_ID, m_tracking_id++ % 65535);
send_event(EV_ABS, ABS_MT_TOOL_TYPE, MT_TOOL_PEN);
// pointer coordinates
send_event(EV_ABS, ABS_MT_POSITION_X, x);
send_event(EV_ABS, ABS_MT_POSITION_Y, y);
send_event(EV_ABS, ABS_MT_TOUCH_MAJOR, m_tracking_id % 2 ? 0x3c : 0x30);
send_event(EV_ABS, ABS_MT_PRESSURE, m_tracking_id % 2 ? 20 : 25);
send_event(EV_SYN, SYN_REPORT);
// pointer up
send_event(EV_ABS, ABS_MT_TRACKING_ID, -1);
send_event(EV_SYN, SYN_REPORT);