使用 Android 系统级应用程序,如何注入AXIS_RTRIGGER或AXIS_GAS事件?

With and Android System-Level app, how do you inject AXIS_RTRIGGER or AXIS_GAS events?

提问人:sumofty 提问时间:11/9/2023 最后编辑:sumofty 更新时间:11/9/2023 访问量:43

问:

我正在尝试制作自己的控制器,该控制器与具有“android.permission.INJECT_EVENTS”权限的系统级应用程序一起使用。该应用程序在后台运行并解释硬件按钮,然后使用 InputManager 将它们发送到活动显示器。这是在带有 Kotlin 的 Android 12L 最低操作系统版本上。查看了 Github 和 cs.android.com,除了对 ca.android.com 的单元测试之外,找不到任何类似的东西,但它们只是验证轴值是否转换为字符串,而不是实际视图。

我不知道如何让它工作

        val eventTime = SystemClock.uptimeMillis()
        val pointerProperties = MotionEvent.PointerProperties()
        pointerProperties.id = 1
        val pointerCoords = MotionEvent.PointerCoords()
        pointerCoords.setAxisValue(MotionEvent.AXIS_RTRIGGER, value)
        val event = MotionEvent.obtain(
            /* downTime= */ eventTime,
            /* eventTime= */ eventTime,
            /* action= */ MotionEvent.ACTION_MOVE,
            /* pointerCount= */ 1,
            /* pointerProperties= */ arrayOf(pointerProperties),
            /* pointerCoords= */ arrayOf(pointerCoords),
            /* metaState= */ 0,
            /* buttonstate= */ 0,
            /* xPrecision= */ 0.1f,
            /* yPrecision= */0.1f,
            /* deviceId= */mInputManager.getInputDevice(-1).id, //Using -1 as that's a virtual inputDevice
            /* edgeFalgs= */0,
            /* source= */InputDevice.SOURCE_GAMEPAD,
            /* flags= */0
        )
        mInputManager.injectInputEvent(event, InputEventInjectionSync.WAIT_FOR_RESULT)
        event.recycle()

使用 https://play.google.com/store/apps/details?id=ru.elron.gamepadtester&hl=en_US&gl=US 进行测试 作为参考,此代码就像左模拟摇杆一样工作。

        val eventTime = SystemClock.uptimeMillis()
        val event = MotionEvent.obtain(
            /* downTime= */ eventTime,
            /* eventTime= */ eventTime,
            /* action= */ MotionEvent.ACTION_MOVE,
            /* x= */ angle,
            /* y= */ 0.0f,
            /* pressure= */ 1.0f,
            /* size= */ 0f,
            /* metaState= */ 0,
            /* xPrecision= */ 0.1f,
            /* yPrecision= */ 0.1f,
            /* deviceId= */ mInputManager.getInputDevice(-1).id,
            /* edgeFlags= */ 0
        )
        event.source = InputDevice.SOURCE_JOYSTICK
        mInputManager.injectInputEvent(event, InputEventInjectionSync.NONE)

        event.recycle()

我尝试了 InputEventInjectionSync、SOURCE_GAMEPAD、SOURCE_JOYSTICK、SOURCE_KEYBOARD的不同变体,并在 setAxisValue 中使用了不同的轴类型

android kotlin 输入 android-source

评论

0赞 Yong 11/9/2023
检查logcat,并尝试找到一些有用的日志

答: 暂无答案