回答
在 Hamibot 中,脚本运行后不会自动开始操作,通常是因为缺少对无障碍服务的正确启用和初始化。基于控件的自动化操作依赖于无障碍服务(Accessibility Service),如果该服务未启用或未正确配置,脚本将无法访问界面元素,也就无法执行后续的操作。
常见原因及解决方法:
-
未调用
auto()或auto.waitFor()- 脚本必须显式请求并等待无障碍服务启动。
- 使用
auto()会在无障碍未启用时跳转到设置页面并停止脚本,需手动返回重跑。 - 推荐使用
auto.waitFor(),它会阻塞脚本直到无障碍服务被用户手动启用,之后自动继续执行。
✅ 正确做法:
// 文档地址 https://docs.hamibot.com/ auto.waitFor(); // 启动后才开始操作 log("无障碍已启用,开始执行"); -
脚本中存在死循环或耗时操作阻塞主线程
- 如果你在
events监听前有while(true)这类无限循环,事件监听将无法响应。 - 事件系统是单线程的,主线程卡住会导致监听失效。
❌ 错误示例:
while (true) { log("忙等待"); } events.on('toast', function(t) { log("收不到Toast:" + t); });✅ 应改为异步处理或使用子线程:
// 文档地址 https://docs.hamibot.com/ threads.start(function() { while (true) { log("后台任务"); sleep(1000); } }); events.on('toast', function(t) { log("收到Toast:" + t); }); // 主线程保持空闲以便处理事件 setInterval(() => {}, 1000); - 如果你在
-
未授予必要的权限(如“查看使用情况统计”)
- 若你使用了
useUsageStats标志来获取准确的包名,但未授权,则可能导致判断失败。 - 可通过以下代码启用:
// 文档地址 https://docs.hamibot.com/ auto.setFlags(['useUsageStats']); auto.waitFor();
- 若你使用了
-
UI 模式下使用了阻塞函数
- 在 UI 模式(带界面的脚本)中使用
auto.waitFor()会导致界面卡住。 - 建议在非 UI 脚本中使用
auto.waitFor(),或在 UI 脚本中用auto()并引导用户提前开启无障碍。
- 在 UI 模式(带界面的脚本)中使用
最佳实践建议
- 每个基于控件操作的脚本开头都加上:
// 文档地址 https://docs.hamibot.com/ auto.waitFor(); - 避免主线程死循环,必要时使用
threads.start()创建子线程。 - 测试时先确保无障碍服务已在“设置 > 辅助功能”中为 Hamibot 开启。
如果你确认以上都已设置但仍不工作,请检查日志输出是否有异常信息,并确保目标应用的界面确实可以被无障碍服务读取(部分加密游戏或 WebView 可能受限)。
ℹ️ 本回答由 AI 生成,内容仅供参考