function takeScreenshot(fileName) {
var Screenshot_thread = null;
var success = false;
try {
log("📷 开始截图...");
Screenshot_thread = threads.start(function () {
const check = () => {
let activity = currentActivity().toLowerCase();
if (activity.indexOf('permission') !== -1) {
if (
id('com.android.systemui:id/dialog_title')
.textContains('Hamibot')
.exists()
) {
var okBtn = id('android:id/button1').findOnce();
if (okBtn) {
okBtn.click();
return;
}
}
}
setTimeout(function () {
check();
}, 500);
};
check();
});

    if (!requestScreenCapture()) {
        log('没有授予 Hamibot 屏幕截图权限');
        return false;
    }
    sleep(1000);

    // 截图
    let path = "/sdcard/Pictures/" + fileName + ".jpg";
    var screenshot = captureScreen(path);
    if (screenshot) {
        log("✅ 截图成功: " + fileName);
    } else {
        log("❌ 截图失败: " + fileName, true);
    }

} catch (error) {
    log("❌ 截图过程中发生错误: " + error.message, true);
    success = false;
}

if (Screenshot_thread) {
    Screenshot_thread.interrupt();
}
log("✅ 截图线程已中断");
return success;

}

写了个方法去截图,单独使用的时候图片保持没有问题,但是跟脚本一起与其他方法使用的时候就有问题,为什么

nnhu4rqy42 · 2 天前

回答

Hamibot AI
1
· 2 天前

你代码中有几个关键问题导致截图在与其他方法一起使用时失败:

主要问题分析

  1. 箭头函数兼容性问题(最严重)
    Hamibot 使用 Rhino 1.7.15 引擎,不支持箭头函数表达式。你的代码中:

    const check = () => { ... }
    

    应该改为普通函数:

    function check() { ... }
    
  2. 返回值处理错误
    captureScreen(path) 不会返回布尔值,它直接保存截图到指定路径。你的代码:

    var screenshot = captureScreen(path);
    if (screenshot) { ... }
    

    这是错误的,captureScreen() 在指定路径保存时不会返回任何值。

  3. 成功标志未正确设置
    你的 success 变量始终为 false,即使截图成功也没有设置为 true。

  4. 线程中断时机不当
    你在截图操作后立即中断线程,可能导致权限处理线程被提前终止。

修正后的代码

// 文档地址 https://docs.hamibot.com/
function takeScreenshot(fileName) {
    var Screenshot_thread = null;
    var success = false;
    try {
        log("📷 开始截图...");
        
        // 修正1:使用普通函数代替箭头函数
        Screenshot_thread = threads.start(function () {
            function check() {
                let activity = currentActivity().toLowerCase();
                if (activity.indexOf('permission') !== -1) {
                    if (
                        id('com.android.systemui:id/dialog_title')
                            .textContains('Hamibot')
                            .exists()
                    ) {
                        var okBtn = id('android:id/button1').findOnce();
                        if (okBtn) {
                            okBtn.click();
                            return;
                        }
                    }
                }
                setTimeout(function () {
                    check();
                }, 500);
            }
            check();
        });

        if (!requestScreenCapture()) {
            log('没有授予 Hamibot 屏幕截图权限');
            return false;
        }
        sleep(1000);

        // 修正2:正确处理截图
        let path = "/sdcard/Pictures/" + fileName + ".png"; // 推荐使用PNG格式
        captureScreen(path); // 不会返回值,直接保存
        
        // 确认文件是否存在
        if (files.exists(path)) {
            log("✅ 截图成功: " + fileName);
            success = true; // 修正3:设置成功标志
        } else {
            log("❌ 截图保存失败: " + fileName);
        }

    } catch (error) {
        log("❌ 截图过程中发生错误: " + error.message);
    } finally {
        // 修正4:确保线程处理正确
        if (Screenshot_thread) {
            Screenshot_thread.interrupt();
            log("✅ 截图线程已中断");
        }
    }
    return success;
}

额外建议

  1. 截图格式:建议使用 PNG 格式而不是 JPG,因为:

    let path = "/sdcard/Pictures/" + fileName + ".png";
    

    PNG 是无损压缩,更适合屏幕截图。

  2. 添加媒体扫描:确保截图能立即在相册中显示:

    media.scanFile(path);
    
  3. 考虑截图间隔:根据知识库提示,"设备截图的更新需要一定的时间(一般来说是 16ms)",如果连续截图,确保有足够间隔。

  4. 权限请求优化:可以考虑使用 auto.waitFor() 确保无障碍服务已启动:

    auto.waitFor();
    if (!requestScreenCapture()) {
      // 处理权限
    }
    

主要问题就是 Rhino 引擎不支持箭头函数,加上返回值处理不当。修正后应该能在与其他方法组合使用时正常工作。

ℹ️ 本回答由 AI 生成,内容仅供参考