回答
在 Hamibot 中,press() 函数是基于 Android 的无障碍服务(AccessibilityService)来模拟触摸的。当同时存在物理手指点击和 press() 模拟点击时,系统可能会认为有多个输入源冲突,导致页面响应异常或“点不动”。
为了解决这个问题,你可以尝试以下几种方法:
1. 使用 RootAutomator (推荐)
如果设备已获取 root 权限,强烈建议使用 RootAutomator 类来进行触摸操作。RootAutomator 使用的是 Linux 系统底层的输入事件注入机制(如 /dev/input/eventX),它比无障碍服务更底层、更直接,因此不会与物理触摸产生冲突。
// 文档地址 https://docs.hamibot.com/reference/coordinatesBasedAutomation#rootautomator
auto.waitFor(); // 确保无障碍服务已启动
// 创建一个 RootAutomator 实例
var ra = new RootAutomator();
// 使用 RootAutomator 进行 press 操作 (x, y, duration)
ra.press(500, 1000, 100); // 在坐标 (500, 1000) 按下 100ms
// ... 执行你的脚本逻辑 ...
// 脚本结束前,务必释放资源
events.on('exit', function() {
if (ra) {
ra.exit();
}
});
优点:
- 不受物理触摸影响,可以完美共存。
- 执行速度快,无延迟。
缺点:
- 需要 root 权限。
- 必须在脚本退出时手动调用
ra.exit()来清理资源,否则可能导致设备触摸失灵。
2. 增加延时和稳定性处理
如果无法使用 Root,只能依赖无障碍服务,那么可以通过增加延时和检查屏幕状态来提高稳定性,避免冲突。
// 文档地址 https://docs.hamibot.com/reference/coordinatesBasedAutomation#安卓-70-以上的触摸和手势模拟
// 尝试执行 press,并捕获可能的失败
function safePress(x, y, duration) {
let success = false;
let attempts = 0;
const maxAttempts = 3; // 最多重试3次
while (!success && attempts < maxAttempts) {
try {
success = press(x, y, duration);
if (!success) {
log(`press 操作在 (${x}, ${y}) 失败,可能是被物理触摸中断,等待后重试...`);
sleep(1000); // 等待1秒再重试
}
} catch (e) {
log(`执行 press 时发生异常: ${e.message},进行重试...`);
success = false;
sleep(500);
}
attempts++;
}
return success;
}
// 使用示例
auto.waitFor();
safePress(500, 1000, 100); // 安全地执行 press
说明:
- 这个方法不能完全避免冲突,但可以减少因单次失败导致的脚本崩溃。
3. 调整操作策略
重新考虑脚本的设计逻辑,是否真的需要在物理触摸的同时进行 press?
- 避免并发: 如果你是在调试或测试,尽量避免在脚本运行时用手去触碰屏幕。
- 异步操作: 让脚本和用户操作错开时间。例如,脚本先执行一部分自动化任务,然后暂停,等待用户完成其交互后,再继续执行。
总结
最根本的解决方案是 使用 RootAutomator。如果你的设备有 root 权限,这是唯一能彻底解决该问题的方法。它将 press 操作从无障碍服务层面提升到内核驱动层面,从根本上避免了与物理触摸的竞争条件。
如果无法 root,则只能通过优化代码(如增加重试机制)和调整使用习惯来降低问题发生的概率。
ℹ️ 本回答由 AI 生成,内容仅供参考