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;
}
写了个方法去截图,单独使用的时候图片保持没有问题,但是跟脚本一起与其他方法使用的时候就有问题,为什么
回答
你代码中有几个关键问题导致截图在与其他方法一起使用时失败:
主要问题分析
-
箭头函数兼容性问题(最严重)
Hamibot 使用 Rhino 1.7.15 引擎,不支持箭头函数表达式。你的代码中:const check = () => { ... }应该改为普通函数:
function check() { ... } -
返回值处理错误
captureScreen(path)不会返回布尔值,它直接保存截图到指定路径。你的代码:var screenshot = captureScreen(path); if (screenshot) { ... }这是错误的,captureScreen() 在指定路径保存时不会返回任何值。
-
成功标志未正确设置
你的success变量始终为 false,即使截图成功也没有设置为 true。 -
线程中断时机不当
你在截图操作后立即中断线程,可能导致权限处理线程被提前终止。
修正后的代码
// 文档地址 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;
}
额外建议
-
截图格式:建议使用 PNG 格式而不是 JPG,因为:
let path = "/sdcard/Pictures/" + fileName + ".png";PNG 是无损压缩,更适合屏幕截图。
-
添加媒体扫描:确保截图能立即在相册中显示:
media.scanFile(path); -
考虑截图间隔:根据知识库提示,"设备截图的更新需要一定的时间(一般来说是 16ms)",如果连续截图,确保有足够间隔。
-
权限请求优化:可以考虑使用
auto.waitFor()确保无障碍服务已启动:auto.waitFor(); if (!requestScreenCapture()) { // 处理权限 }
主要问题就是 Rhino 引擎不支持箭头函数,加上返回值处理不当。修正后应该能在与其他方法组合使用时正常工作。