android - 如何在 Android 上将输入事件注入(inject)自己的应用程序?

标签 android

我正在寻找一种方法,如何从特定应用程序中的代码将触摸或键盘事件等输入事件注入(inject)到自己的应用程序中。 NOT 进入 Android 操作系统或其他需要签名级权限 android.permission.INJECT_EVENTS 或 root 设备的应用程序 b/c,我必须避免这两种情况。我正在寻找一种在没有任何提升权限的情况下在非 root 设备上运行的代码。

我在基于以下概念的代码方面取得了一些进展:

View v = findViewById(android.R.id.content).getRootView();
v.dispatchTouchEvent(e);

最佳答案

我认为 getRootView 和 dispatch 它应该运行良好,如果有任何问题的话。请简单介绍一下。

或者有一个更高层次但更棘手的方法来做到这一点。 在 View.java 中,有一个名为 getViewRootImpl() 的隐藏 api,它将返回此 Activity 的 android.view.ViewRootImpl 对象。并且它上面有一个名为 enqueueInputEvent(InputEvent event) 的方法。这样就可以使用反射来获取这个方法。

由于我刚刚完成了一个使用键盘向屏幕发送触摸命令的项目,我认为当您尝试将此类事件注入(inject) Activity 时,多点触摸可能会成为问题。当您尝试将另一根手指放在屏幕上时。事件 Action 必须是 ACTION_POINTER_DOWN,带有名为属性的数组的索引移位。而且你还应该处理属性和坐标数组,其中包括每次所有手指的信息,即使你此时只需要移动一根手指。设置为 properties[i].id 的手指 ID 用于识别您的手指。但是数组的索引并不固定。

        for (int i = 0; i < size; i++) {
            properties[i].id = fingerId;
            properties[i].toolType = MotionEvent.TOOL_TYPE_FINGER;

            coordses[i].x = currentX;
            coordses[i].y = currentY;
            coordses[i].pressure = 1;
            coordses[i].size = DEFAULT_SIZE;
        }
        event = MotionEvent.obtain(
                    mDownTime, SystemClock.uptimeMillis(),
                    ((size - 1) << MotionEvent.ACTION_POINTER_INDEX_SHIFT)
                            + MotionEvent.ACTION_POINTER_DOWN,
                    size,
                    properties, coordses, DEFAULT_META_STATE, DEFAULT_BUTTON_STATE,
                    DEFAULT_PRECISION_X, DEFAULT_PRECISION_Y, DEFAULT_DEVICE_ID,
                    DEFAULT_EDGE_FLAGS, InputDevice.SOURCE_TOUCHSCREEN, DEFAULT_FLAGS);

关于android - 如何在 Android 上将输入事件注入(inject)自己的应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40440209/

相关文章:

Android 不更新 SQLite 数据库

android - 如何检测用户正在使用语音转文字?

安卓牛轧糖 : Detected problems with app native libraries

Android 手势不被识别

设备上没有摄像头的 Android 用户无法从 Google Play 下载我的应用程序 - 为什么?

android - 如何在 Androidx Compose Material 中删除 TextField 的指示线?

java - 在 android studio 中膨胀类 com.google.android.gms.ads.AdView 时出错

android - 在 Android 的第二个项目中添加 .so 库

java - Activity 启动后导致应用程序崩溃

java - HttpUrlConnection 未连接到服务器