OCR 识别出错 java.lang.SecurityException: No screen capture

HAMI_2664576427 · 10 小时前

回答

Hamibot AI
1
· 10 小时前

这个错误是因为脚本在执行 OCR 识别或 captureScreen() 时,未获取到 Android 系统的屏幕截图权限。Hamibot 依赖系统级截图服务,未授权时调用会直接抛出 java.lang.SecurityException: No screen capture

解决步骤

  1. 显式申请截图权限:在调用任何截图或依赖截图的 OCR 函数前,必须先执行 requestScreenCapture()。该函数仅用于申请权限,不会直接截图。
  2. 自动处理系统弹窗:首次调用会触发系统权限请求弹窗,会阻塞主线程。需使用子线程自动点击“允许”或“总是允许”。
  3. 等待服务初始化:权限授予后,系统需要几百毫秒准备截图服务,立即调用截图可能失败或返回旧帧,需添加短暂延迟。

兼容 Rhino 引擎的示例代码

// 文档地址 https://docs.hamibot.com/
// 启动子线程自动处理截图权限弹窗
threads.start(function () {
    for (var i = 0; i < 10; i++) {
        if (text('允许').exists()) {
            text('允许').click();
            break;
        }
        if (text('总是允许').exists()) {
            text('总是允许').click();
            break;
        }
        sleep(500);
    }
});

// 申请截图权限(方向默认跟随当前屏幕)
if (!requestScreenCapture()) {
    toastLog('未获取截图权限,脚本退出');
    exit();
}

// 等待截图服务初始化完成
sleep(800);

// 此时可安全执行 captureScreen() 或 OCR 识别
var img = captureScreen();
// 你的 OCR 逻辑...

关键注意事项

  • requestScreenCapture() 在单次脚本运行中只需调用一次,无需每次截图前重复调用。
  • 权限弹窗的按钮文本或 ID 因机型和系统版本而异。若自动点击未生效,可手动点击一次并勾选“总是允许”,后续运行将不再弹窗。
  • 若弹窗无法识别,可通过 toastLog(currentActivity()) 输出当前界面 Activity 名称,辅助定位按钮控件。
  • 执行 requestScreenCapture() 时的屏幕方向决定了后续截图的方向。如需固定横屏或竖屏截图,请在申请前锁定设备方向或传入对应参数。
  • 确保 Hamibot 在系统设置中已开启“无障碍服务”及“屏幕录制/截图”权限,部分定制系统(如 MIUI、ColorOS)可能需要在权限管理中单独放行。

按上述流程处理权限后,OCR 识别即可正常获取屏幕图像。如仍有异常,可提供触发 OCR 的具体代码片段,我会帮你进一步排查。

ℹ️ 内容由 AI 生成,可能不准确,请注意核实