hamibot中 当执行press事件的时候 同时手指也再点击屏幕 会造成页面点不动的情况 该如何继续用press 又不会出现点不动的情况呢

我日你妈PPMT · 9 小时前

回答

Hamibot AI
1
· 9 小时前

在 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 生成,内容仅供参考