【问题标题】:Android virtual mouse cursor can't click outside the appAndroid虚拟鼠标光标无法在应用外点击
【发布时间】:2017-02-26 18:08:27
【问题描述】:

我正在为 Android Studio 的虚拟鼠标光标编程,这是来自 website 及其 code 中的一个示例。我有一个覆盖光标和以下代码可以返回主屏幕。

Intent newActivity = new Intent(Intent.ACTION_MAIN);
newActivity.addCategory(Intent.CATEGORY_HOME);
newActivity.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(newActivity);

我的问题是当视图在我的应用程序之外(可能是主屏幕或其他应用程序)时,如何将点击操作应用于我的光标。我试过这个

Instrumentation m_Instrumentation = new Instrumentation();
m_Instrumentation.sendPointerSync(MotionEvent.obtain(SystemClock.uptimeMillis(),SystemClock.uptimeMillis(),MotionEvent.ACTION_DOWN,new_x, new_y, 0));
m_Instrumentation.sendPointerSync(MotionEvent.obtain(SystemClock.uptimeMillis(),SystemClock.uptimeMillis(), MotionEvent.ACTION_UP, new_x, new_y, 0));

但它显示了

注入到另一个应用程序需要 INJECT_EVENTS 权限

然后,我添加了 <uses-permission android:name="android.permission.INJECT_EVENTS"/> 在 AndroidManifest.xml 中。有一个名为“权限仅授予系统应用程序”的错误,因此我无法在我的应用程序中使用它来执行虚拟点击。如果我只是关闭检查系统,它仍然不适用于我的应用程序。

之后,我用 Handler 尝试了 dispatchTouchEvent,但它只适用于我自己的应用程序(不能在主屏幕上使用来打开其他应用程序。)

dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis() + 100, MotionEvent.ACTION_DOWN, new_x, new_y, 0));
dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis() + 100, MotionEvent.ACTION_UP, new_x, new_y, 0));

感谢您的回复。
我的模拟移动设备是 Android 4.4.2。
编译SDK版本:Android 6.0
构建工具版本:24.0.3

【问题讨论】:

    标签: android inject mouse-cursor


    【解决方案1】:

    你不能。出于安全原因,您不允许这样做-出于安全目的,他们不希望一个应用程序能够向另一个应用程序发送命令。仪器的东西是用于单元测试的,它之所以有效,只是因为测试套件是同一应用程序的一部分。

    【讨论】:

    • 谢谢。如果我root了我的手机,如何在我的项目中打开INJECT_EVENTS的权限?
    • 您需要将权限添加到清单中,然后将自己安装在系统应用程序目录中(取决于您的版本,/system/apps 或 /system/priv-apps)。安装在那里的任何应用程序都可以请求系统权限。因此,它不适用于 Play 商店应用,但可以用于个人应用。
    • 我安装了this 来根我的系统,然后将INJECT_EVENTS 权限添加到我的AndroidManifest。但是,它在我的调试窗口中显示了相同的注入另一个应用程序需要 INJECT_EVENTS 权限
    • 您是否将应用程序安装到正确的系统应用程序目录?见androidauthority.com/…
    • 我按照网络上的步骤,将我的应用程序剪切到系统/应用程序,然后更改其权限。目前,我的所有者和组是 root。重新打开手机并安装应用程序后。这是错误并再次崩溃。
    【解决方案2】:

    您可能会发现此链接很有帮助 :)

    https://github.com/chetbox/android-mouse-cursor

    它没有生根,他设法使用这些线发送点击

        private void click() {
        Log.d(TAG, String.format("Click [%d, %d]", cursorLayout.x, cursorLayout.y));
        AccessibilityNodeInfo nodeInfo = getRootInActiveWindow();
        if (nodeInfo == null) return;
        AccessibilityNodeInfo nearestNodeToMouse = findSmallestNodeAtPoint(nodeInfo, cursorLayout.x, cursorLayout.y + 50);
        if (nearestNodeToMouse != null) {
            logNodeHierachy(nearestNodeToMouse, 0);
            nearestNodeToMouse.performAction(AccessibilityNodeInfo.ACTION_CLICK);
        }
        nodeInfo.recycle();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-26
      • 2022-11-18
      • 2016-04-14
      • 1970-01-01
      相关资源
      最近更新 更多