在Android上模拟触摸事件,不影响用户界面(需要root权限)

5
我有一个任务,需要在给定的坐标模拟触摸/滑动事件,并且同时不影响用户交互(即需要同时进行编程模拟和用户触摸输入)。可以使用已经root过的手机。我尝试了以下方法,使用"SYSTEM_ALERT_WINDOW"和"Draw over the app"的帮助,但是无法实现:
1. 通过AccessibilityService -> dispatchGesture。但是AccessibilityService是同步的,只能处理任何一个事件(编程或用户)中的一个。参考:https://github.com/aosp-mirror/platform_frameworks_base/blob/master/core/java/android/accessibilityservice/AccessibilityService.java#L1017 2. Instrumentation.sendPointerSync -> 但是它需要INJECT_EVENT权限才能在其他应用程序上进行触摸,该权限仅适用于平台签名应用程序。
为了解决这个权限问题,将INJECT_EVENT权限状态更改为“instant”,并刷入自定义ROM。 仍然无法同时处理编程和用户触摸事件。

Ref:http://aosp.opersys.com/xref/android-11.0.0_r33/xref/frameworks/base/core/res/AndroidManifest.xml#3189

  1. 在已经root的手机上尝试执行"/system/bin/input touchscreen swipe fromx,fromy,tox,toy,count",实际上就是"adb shell input touchscreen swipe"。仍然无法同时处理编程和用户触摸事件。

有没有办法通过编程模拟触摸而不影响用户交互?这可能吗?

提前感谢。

2个回答

0
如果设备已经Root,你可以扫描“/dev/input/eventXX”以寻找触摸屏设备,然后将输入事件写入该“文件”。 这并不容易(特别是识别触摸屏使用的正确文件),但它能够工作。

嗨,@emandt 我也尝试过这个方法。就像“adb shell getevent”记录滑动并将十六进制转换为正常值,然后再通过adb shell sendevent传递它。但是当用户交互时,它也会停止,并在用户触摸完成后恢复。它不是并行执行的。 - Suresh
我必须承认,我从未尝试在用户物理使用触摸屏时发送虚假/虚拟事件...也许内核会优先处理硬件事件,而不是同时使用两者。我不认为还有其他方法(低代码)可以绕过这种内核行为。抱歉。 - emandt

0

您可以使用以下代码:

Runtime.getRuntime().exec("input touchscreen swipe X1 Y1 X2 Y2").waitFor()

其中 (X1, Y1; X2, Y2) 为您的滑动开始和结束坐标。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接