我希望能够将不同的事件注入Android设备。经过一些搜索,我发现我可以通过访问Android操作系统中的事件输入节点来实现这一点,这些节点位于dev/input/eventX
中。一旦访问它们,就可以进行读写操作,因此我可以注入事件。
问题是这些节点只能在root设备中访问。如果我尝试在没有生根的情况下使用它们,则该过程将失败,如本文所述,
http://www.pocketmagic.net/programmatically-injecting-events-on-android-part-2/
我不想让设备生根以保证其保修。我在网上搜索了访问Android操作系统的可能方法,但我只发现了root。
我认为它可行的替代方法是将应用程序编译为系统应用程序,但我无法确定这是否允许它对事件输入节点具有访问权限(读取和写入权限)。这种方法会提供这些特权吗?
如果没有,是否有其他替代方法可以生根,我可以在没有设备生根的情况下为我的应用程序提供系统权限?
感谢任何帮助。
感谢。
编辑:为了详细说明,我想要注入不同的触摸事件。例如,单点触摸,滑动等。
答案 0 :(得分:1)
您可以通过执行Android附带的/system/bin/input
实用程序在设备上注入输入事件。您可以在this question中看到一些使用它的示例(通过adb)。输入实用程序似乎不需要任何特殊权限来执行。
要创建系统应用程序,您需要访问在为您的设备构建Android操作系统时使用的签名密钥 - 您不能只修改普通应用程序以获得系统权限。即使你可以,它也不会给你root访问权限(尽管你可能使它成为/dev/input/eventX
设备似乎也允许访问的输入用户组的一部分)。
如果要注入触摸事件,可以使用Java Runtime class的/system/bin/input
方法执行exec()
实用程序,或者只使用injectMotionEvent()
方法/**
* Builds a MotionEvent and injects it into the event stream.
*
* @param inputSource the InputDevice.SOURCE_* sending the input event
* @param action the MotionEvent.ACTION_* for the event
* @param when the value of SystemClock.uptimeMillis() at which the event happened
* @param x x coordinate of event
* @param y y coordinate of event
* @param pressure pressure of event
*/
private void injectMotionEvent(int inputSource, int action, long when, float x, float y, float pressure) {
final float DEFAULT_SIZE = 1.0f;
final int DEFAULT_META_STATE = 0;
final float DEFAULT_PRECISION_X = 1.0f;
final float DEFAULT_PRECISION_Y = 1.0f;
final int DEFAULT_DEVICE_ID = 0;
final int DEFAULT_EDGE_FLAGS = 0;
MotionEvent event = MotionEvent.obtain(when, when, action, x, y, pressure, DEFAULT_SIZE,
DEFAULT_META_STATE, DEFAULT_PRECISION_X, DEFAULT_PRECISION_Y, DEFAULT_DEVICE_ID,
DEFAULT_EDGE_FLAGS);
event.setSource(inputSource);
Log.i(TAG, "injectMotionEvent: " + event);
InputManager.getInstance().injectInputEvent(event,
InputManager.INJECT_INPUT_EVENT_MODE_WAIT_FOR_FINISH);
}
3}}。
以下是从Android源码中获取的方法,显示如何注入MotionEvent - 您可以查看完整的InputManager以获取更多信息。
dictionary
这些方法只允许您将事件注入您自己的应用程序窗口。
如果您想将事件注入不属于您的应用程序的其他窗口,您需要在应用程序清单中声明其他权限(READ_INPUT_STATE和INJECT_EVENTS)并使用Android操作系统签名密钥对您的应用程序进行签名。换句话说,将事件注入其他应用程序所需的权限永远不会授予普通应用程序(出于显而易见的原因)。