Android虚拟鼠标光标无法在应用外部点击

时间:2017-02-26 18:08:27

标签: android pointers cursor mouse inject

我正在为Android工作室编写虚拟鼠标光标,这是来自此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权限

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

之后,我尝试使用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

2 个答案:

答案 0 :(得分:0)

你做不到。出于安全原因,您不被允许 - 他们不希望一个应用程序出于安全目的向另一个应用程序发送命令。仪器设备用于单元测试,它只能用于测试套件是同一个应用程序的一部分。

答案 1 :(得分:0)

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

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();
}