在没有 root 的情况下访问 Android 中的事件输入节点

Accessing event input nodes in Android withour rooting

我希望能够将不同的事件注入 Android 设备。经过一些搜索,我发现我可以通过访问 Android OS 中的事件输入节点来完成此操作,这些节点位于 dev/input/eventX 中。一旦访问了这些,就可以进行读写操作,因此我可以注入事件。

问题是这些节点只能在获得 root 权限的设备中访问。如果我尝试在没有 root 的情况下使用它们,如本文所述,该过程将失败,

http://www.pocketmagic.net/programmatically-injecting-events-on-android-part-2/

我不想 root 设备以保留其保修。我在网上搜索了访问 Android OS 的可能方法,但我只找到了生根。

我认为可行的另一种方法是将应用程序编译为系统应用程序,但我无法确定这是否会允许它访问(读取和写入权限)事件输入节点。这种方法会提供这些特权吗?

如果没有,是否有其他替代方式来获得 root 权限,我可以在不对设备进行 root 权限的情况下为我的应用程序授予系统权限?

感谢任何帮助。

谢谢。

编辑:为了详细说明,我想注入不同的触摸事件。例如,单击、滑动等。

您可以通过执行 Android 附带的 /system/bin/input 实用程序在设备上注入输入事件。您可以在 this question 中看到一些使用它的示例(通过 adb)。输入实用程序似乎不需要任何特殊权限即可执行。

要创建系统应用程序,您需要访问在为您的设备构建 Android OS 时使用的签名密钥 - 您不能只修改普通应用程序来为其提供系统特权。即使可以,它也不会给您 root 访问权限(尽管您可能会使其成为 /dev/input/eventX 设备似乎也允许访问的输入用户组的一部分)。

如果要注入触摸事件,可以使用 Java Runtime class or just use the injectMotionEvent() method in InputManagerexec() 方法执行 /system/bin/input 实用程序。

下面是取自 Android 源代码的方法,展示了如何注入 MotionEvent - 您可以查看完整的 source 了解更多信息。

/**
     * 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);
    }

这些方法只允许您将事件注入您自己的应用程序windows

如果您想将事件注入不属于您的应用的其他 windows,您需要在应用清单 [=32] 中声明额外的权限(READ_INPUT_STATE 和 INJECT_EVENTS) =] 和 使用 Android OS 签名密钥签署您的应用程序。换句话说,将事件注入其他应用程序所需的权限永远不会授予普通应用程序(出于显而易见的原因)。