Autox.js 截屏权限无响应 黑屏 或 一直转圈的解决办法
图像识别全挂了?先查截屏权限
图像识别和 OCR 的前提是 captureScreen() 能拿到有效图片。如果截屏失败,后面全部白搭。
常见症状与排查
症状 1:requestScreenCapture() 没反应
调用后什么都不弹、或者弹窗点了允许但脚本还是说失败。
排查步骤:
- 是新版本吗:v7.2.3 之前的版本截屏权限有不少 bug,先升级到 v7.2.3+
- 试试 Legacy 方式:v7.2.3 新增了不跳出 App 的旧方式
if (!images.requestScreenCaptureLegacy()) {
toast("截屏权限请求失败");
exit();
}
- 手动授予:系统设置 → 应用权限 → Autox.js → 找到"截屏"权限,手动允许
- 某些 ROM 有限制:MIUI/ColorOS 对截屏权限有额外限制,去设置里搜"截屏权限"看看有没有单独开关
症状 2:截屏后图片是黑的
成功拿到图片但内容全黑。
原因与解决:
| 原因 | 解决 |
|---|---|
| 屏幕被锁屏了 | 截屏只能截亮屏状态 |
| 正在播放 DRM 加密视频 | 系统层面禁止截屏(防盗版),无解 |
| 某些全屏 App / 游戏 | 部分全屏渲染的 App 拒绝被截屏 |
| Android 系统限制 | 某些版本截屏有延迟,sleep 一下再截 |
// 截屏前确保屏幕亮着
if (!device.isScreenOn()) {
device.wakeUp();
sleep(500);
}
// 截屏
let img = captureScreen();
if (img) {
// 检查是不是全黑
let avgBrightness = images.getSimilarity(img, images.createImg(1, 1, "#000000"));
if (avgBrightness < 0.01) {
toast("截屏结果全黑,请检查屏幕状态");
}
}
症状 3:截屏一直转圈 / 无响应
可能是截图服务挂了。v7.2.3 有相关的修复:
// 主动释放截图服务,重新申请
images.stopScreenCapture();
sleep(500);
if (!requestScreenCapture()) {
toast("重新申请也失败了");
exit();
}
症状 4:截屏后 App 崩溃或内存泄漏
v7.2.3 修复了 debug 模式下 ResourceMonitor 导致的内存泄漏和截屏服务内存泄漏。升级是首选。
截屏服务的生命周期
理解截屏权限的行为能帮你少踩坑:
| 行为 | 权限状态 |
|---|---|
App 首次调用 requestScreenCapture() | 系统弹窗 → 用户点允许 → 授权生效 |
| 第二次调用(同一 App 未卸载) | 不弹窗,直接授权 |
| App 被卸载或数据被清除 | 权限重置,下次要重新授权 |
| 用户在系统设置里手动撤销 | 下次调用会重新弹窗 |
| Android 11+ 某些机型 | 可能每次都弹窗,需要手动选"总是允许" |
实战:健壮的截屏初始化
console.show();
function initScreenCapture() {
// 先尝试正常方式
if (requestScreenCapture()) {
console.log("截屏权限已获取");
return true;
}
console.log("正常方式失败,尝试 Legacy...");
// v7.2.3+ 尝试 Legacy 方式
if (typeof images.requestScreenCaptureLegacy === "function") {
if (images.requestScreenCaptureLegacy()) {
console.log("Legacy 方式获取成功");
return true;
}
}
console.error("所有方式都失败,尝试 stop 后重试");
// stop 后重试
try { images.stopScreenCapture(); } catch (e) {}
sleep(500);
if (requestScreenCapture()) {
console.log("重试成功");
return true;
}
// 最后手段:引导用户手动设置
toast("请手动授予截屏权限");
app.startActivity({
action: "android.settings.CAPTURE_POLICY_SETTINGS"
});
return false;
}
if (!initScreenCapture()) {
exit("截屏权限初始化失败");
}
截屏成功后的使用
let img = captureScreen();
if (img) {
try {
// 使用 img...
} finally {
img.recycle(); // 一定要释放内存
}
} else {
console.error("captureScreen 返回 null");
}
总结
| 问题 | 最快修复 |
|---|---|
| 权限不弹 | 升级 v7.2.3+;用 Legacy 方式 |
| 截屏全黑 | 确保屏幕亮着;检查是否 DRM 加密 |
| 内存泄漏 | 升级 v7.2.3;用完必 .recycle() |
| 每次都弹权限 | Android 11+ 限制,手动选"总是允许" |