回答
脚本识图失败是常见问题,通常由以下几个原因导致。请按以下步骤逐一排查:
一、常见原因及解决方案
1. 屏幕截图权限未授予
识图功能需要先获取屏幕截图权限。
// 文档地址 https://docs.hamibot.com/
if (!requestScreenCapture()) {
toastLog('没有授予 Hamibot 屏幕截图权限');
hamibot.exit();
}
sleep(1000);
2. 图片相似度阈值过高
默认阈值为 0.9,如果截图与模板有细微差异会导致匹配失败。可适当降低阈值。
// 文档地址 https://docs.hamibot.com/
var img = captureScreen();
var template = images.read('/sdcard/template.png');
// 降低阈值到 0.8 或 0.7
var point = images.findImage(img, template, {threshold: 0.8});
if (point) {
click(point.x, point.y);
}
3. 截图时机不当
页面未完全加载时截图会导致识图失败。
// 文档地址 https://docs.hamibot.com/
sleep(2000); // 等待页面加载
var img = captureScreen();
4. 找图区域过大
限定找图区域可提高效率和准确率。
// 文档地址 https://docs.hamibot.com/
// region: [x, y, width, height]
var point = images.findImage(img, template, {
threshold: 0.8,
region: [0, 100, 1080, 800]
});
5. 模板图片问题
- 模板图片与当前屏幕分辨率不匹配
- 模板图片截取范围不准确
- 模板图片有动态元素(如时间、电量等)
建议:重新截取模板图片,确保只包含静态特征区域。
二、完整排查代码示例
// 文档地址 https://docs.hamibot.com/
auto.waitFor();
// 1. 请求截图权限
if (!requestScreenCapture()) {
toastLog('没有授予 Hamibot 屏幕截图权限');
hamibot.exit();
}
sleep(1000);
// 2. 设置屏幕分辨率(可选,用于坐标适配)
setScreenMetrics(1080, 1920);
// 3. 截图
var img = captureScreen();
if (!img) {
toastLog('截图失败');
hamibot.exit();
}
// 4. 读取模板
var template = images.read('/sdcard/template.png');
if (!template) {
toastLog('模板图片不存在');
hamibot.exit();
}
// 5. 找图(降低阈值,增加容错)
var point = images.findImage(img, template, {threshold: 0.7});
if (point) {
toastLog('找到图片,位置:' + point.x + ', ' + point.y);
click(point.x, point.y);
} else {
toastLog('未找到图片');
}
// 6. 释放资源
img.recycle();
template.recycle();
三、最佳实践建议
| 问题 | 建议 |
|---|---|
| 阈值设置 | 从 0.9 开始,失败后逐步降至 0.7 |
| 模板图片 | 截取特征明显、无动态元素的区域 |
| 截图时机 | 页面加载完成后等待 1-2 秒再截图 |
| 多次尝试 | 可循环尝试 3-5 次,每次间隔 500 毫秒 |
| 资源释放 | 使用完毕后调用 recycle() 释放图片资源 |
四、替代方案
如果识图持续失败,可考虑以下替代方案:
- 文字识别(OCR):使用
ocr.recognizeText()识别文字后定位 - 控件查找:使用
text()、id()等控件选择器 - 坐标点击:使用
setScreenMetrics()配合固定坐标
如问题仍未解决,请提供以下信息以便进一步分析:
- 脚本代码片段
- 目标应用名称
- 设备型号和 Android 版本
- 错误日志内容
ℹ️ 本回答由 AI 生成,内容仅供参考