如何使用图片识别来识别控件
11:51:05.007/E: Wrapped java.lang.SecurityException: No screen capture permission (<init>#29)
Wrapped java.lang.SecurityException: No screen capture permission
回答
文档地址 https://docs.hamibot.com/
使用图片识别来识别控件是 Hamibot 自动化工具的一个重要功能,以下是一个基本的实现步骤和示例代码:
1. 准备工作
确保你的脚本已经申请了屏幕截图权限:
auto.waitFor(); // 等待无障碍服务
if (!requestScreenCapture()) {
toastLog('请授予屏幕截图权限!');
hamibot.exit(); // 权限未授予则退出
}
2. 截取屏幕并进行 OCR 识别
通过 captureScreen()
截取当前屏幕图像,然后使用 OCR 识别图像中的文字信息:
// 截取当前屏幕
const img = captureScreen();
// 识别图片中的文字(返回带坐标的详细信息)
const result = ocr.recognize(img);
log(result);
// 仅获取纯文本内容
const textResult = ocr.recognizeText(img);
toastLog('识别结果:' + textResult);
3. 识别特定区域
如果你只需要识别某个特定区域内的文字,可以使用 images.clip
截取指定区域:
// 截取指定区域(参数:左,上,右,下)
const regionImg = images.clip(img, 100, 200, 500, 400);
// 识别区域文字
const areaText = ocr.recognizeText(regionImg);
log('区域识别结果:', areaText);
4. 实际应用场景示例
场景 1:识别验证码
// 截取验证码区域
const codeImg = images.clip(captureScreen(), 300, 500, 600, 600);
const verifyCode = ocr.recognizeText(codeImg);
log('验证码内容:' + verifyCode);
场景 2:自动化表单填写
// 识别输入框文字
const inputText = ocr.recognizeText(
images.clip(captureScreen(), 50, 300, 400, 350)
);
if (inputText.includes('请输入手机号')) {
// TODO 填入输入框
}
5. 注意事项
- 准确率影响因素:图片清晰度、文字字体/大小、背景复杂度等都会影响识别准确率。
- 性能优化建议:
- 使用
images.resize()
调整图片大小以加快识别速度。 - 使用
images.grayscale()
将图片转为灰度图,提高识别效率。
- 使用
- 错误处理:建议用
try...catch
捕获异常,避免程序因识别失败而崩溃。
6. 结合控件选择器(UiSelector)定位元素
OCR 可以与 UiSelector 配合使用,例如先通过 OCR 识别目标控件的文字信息,再结合 UiSelector 定位并操作该控件。这种方式可以用于实现更复杂的自动化流程。
通过上述方法,你可以有效地利用图片识别技术在 Hamibot 中定位和操作控件。
补充回答 1
文档地址 https://docs.hamibot.com/
这个错误信息表明脚本没有获得 Hamibot 的屏幕截图权限,导致调用截图相关功能时抛出了 SecurityException
异常。
解决方案
1. 请求截图权限
在脚本开头使用以下代码请求截图权限,并确保用户已授予:
auto.waitFor(); // 等待无障碍服务启动
if (!requestScreenCapture()) {
toastLog("请先授予屏幕截图权限!");
hamibot.exit(); // 没有权限则退出脚本
}
2. 手动开启权限
如果脚本运行后仍然提示权限问题,请手动检查并开启截图权限:
- 打开 Hamibot 应用;
- 进入脚本详情页;
- 点击【启用截图权限】按钮(或类似选项);
- 在系统弹窗中选择“允许”以授予截图权限。
3. 延迟执行截图操作
截图权限申请成功后,设备需要一定时间初始化截图功能。建议在申请权限后添加延迟再进行截图操作:
sleep(1000); // 等待 1 秒后再截图
var img = captureScreen();
4. 完整示例
下面是一个完整的请求截图权限和截取屏幕的示例脚本:
auto.waitFor(); // 等待无障碍服务
if (!requestScreenCapture()) {
toastLog("请授予屏幕截图权限!");
hamibot.exit();
}
sleep(1000); // 等待截图权限生效
var img = captureScreen(); // 截取当前屏幕
toastLog("截图完成");
hamibot.exit();
5. 其他注意事项
- 如果你使用的是横屏应用,请改用
requestScreenCapture(true)
来请求横屏截图。 - 某些设备或系统版本可能对截图功能有限制,请尝试重启 Hamibot 或设备。
如果你仍有问题,可以发送邮件到 support@hamibot.cn 获取进一步帮助。