6.7.0 - Alpha7 - 修复频繁获取或重建 ImageReader 时可能因缓冲区暂无可用帧导致应用崩溃的问题

This commit is contained in:
SuperMonster003
2025-10-23 23:04:16 +08:00
parent 35fbcbda42
commit 369ceba230
4 changed files with 21 additions and 10 deletions

View File

@@ -1,11 +1,12 @@
{ {
"$data": { "$data": {
"v6.7.0": { "v6.7.0": {
"released_date": "2025/10/09", "released_date": "2025/10/19",
"feature": [ "feature": [
"zip 模块, 用于文件压缩与解压缩操作 (Ref to [Auto.js Pro](https://g.pro.autojs.org/)) (参阅 项目文档 > [Zip](https://docs.autojs6.com/#/zip))", "zip 模块, 用于文件压缩与解压缩操作 (Ref to [Auto.js Pro](https://g.pro.autojs.org/)) (参阅 项目文档 > [Zip](https://docs.autojs6.com/#/zip))",
"mediainfo 模块, 用于查看媒体文件的详细信息 (参阅 项目文档 > [媒体信息](https://docs.autojs6.com/#/mediainfo))", "mediainfo 模块, 用于查看媒体文件的详细信息 (参阅 项目文档 > [媒体信息](https://docs.autojs6.com/#/mediainfo))",
"UiObject#isShifted 方法, 用于检测控件位置变化", "UiObject#isShifted 方法, 用于检测控件位置变化",
"s13n.bytes 方法, 用于标准化点对象及时长对象 (参阅 项目文档 > [标准化](https://docs.autojs6.com/#/s13n))",
"structuredClone 全局方法, 用于深拷贝 JavaScript 对象 (参阅 [MDN](https://developer.mozilla.org/zh-CN/docs/Web/API/Window/structuredClone))", "structuredClone 全局方法, 用于深拷贝 JavaScript 对象 (参阅 [MDN](https://developer.mozilla.org/zh-CN/docs/Web/API/Window/structuredClone))",
"设置页面支持应用启动器图标设置选项 _[`issue #405`](http://issues.autojs6.com/405)_", "设置页面支持应用启动器图标设置选项 _[`issue #405`](http://issues.autojs6.com/405)_",
"Scrapers 工具 (run-scrapers.mjs) 用于自动更新 Gradle 构建脚本结构化数据/README 通用数据/README 模板数据等" "Scrapers 工具 (run-scrapers.mjs) 用于自动更新 Gradle 构建脚本结构化数据/README 通用数据/README 模板数据等"
@@ -15,6 +16,7 @@
"timers.keepAlive 方法 timeout 参数功能无效的问题", "timers.keepAlive 方法 timeout 参数功能无效的问题",
"floaty.window/rawWindow 方法无法接受字符串参数的问题", "floaty.window/rawWindow 方法无法接受字符串参数的问题",
"util.class[Name]/getClass[Name] 可能返回错误结果的问题", "util.class[Name]/getClass[Name] 可能返回错误结果的问题",
"无法使用 console/toast 等方法显示 BigInt 数据类型的问题",
"部分全局对象可能丢失 JavaScript 原型属性及方法的问题", "部分全局对象可能丢失 JavaScript 原型属性及方法的问题",
"使用 XML 语法将 JavaScript 表达式作为属性值时, this 对象可能出现指向错误的问题", "使用 XML 语法将 JavaScript 表达式作为属性值时, this 对象可能出现指向错误的问题",
"canvas 元素控件 setMaxFps 方法内部帧率计算错误", "canvas 元素控件 setMaxFps 方法内部帧率计算错误",
@@ -24,6 +26,7 @@
"images 部分相关方法可能引发内存泄露的问题 _[`issue #372`](http://issues.autojs6.com/372)_", "images 部分相关方法可能引发内存泄露的问题 _[`issue #372`](http://issues.autojs6.com/372)_",
"Android 10 UiObject#child 方法可能出现 ArrayIndexOutOfBoundsException 异常的问题 _[`issue #416`](http://issues.autojs6.com/416)_", "Android 10 UiObject#child 方法可能出现 ArrayIndexOutOfBoundsException 异常的问题 _[`issue #416`](http://issues.autojs6.com/416)_",
"运行项目时 project.json 配置参数无法正常解析的问题", "运行项目时 project.json 配置参数无法正常解析的问题",
"频繁获取或重建 ImageReader 时可能因缓冲区暂无可用帧导致应用崩溃的问题",
"打包应用无法正常使用 Paddle OCR 与 Rapid OCR 功能的问题", "打包应用无法正常使用 Paddle OCR 与 Rapid OCR 功能的问题",
"版本历史页面部分系统因字体差别导致统计数据显示不完整的问题", "版本历史页面部分系统因字体差别导致统计数据显示不完整的问题",
"部分设备无法正常初始化 MLKit Google OCR 的问题 (试修) _[`issue #8`](http://issues.autojs6.com/8#issuecomment-3117061768)_", "部分设备无法正常初始化 MLKit Google OCR 的问题 (试修) _[`issue #8`](http://issues.autojs6.com/8#issuecomment-3117061768)_",

View File

@@ -5,6 +5,7 @@ import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.res.Configuration; import android.content.res.Configuration;
import android.graphics.PixelFormat; import android.graphics.PixelFormat;
import android.hardware.display.DisplayManager;
import android.hardware.display.VirtualDisplay; import android.hardware.display.VirtualDisplay;
import android.media.Image; import android.media.Image;
import android.media.ImageReader; import android.media.ImageReader;
@@ -123,7 +124,7 @@ public class ScreenCapturer {
}, mHandler); }, mHandler);
} }
mVirtualDisplay = mMediaProjection.createVirtualDisplay(ScreenCapturer.class.getSimpleName(), width, height, screenDensity, 16, mImageReader.getSurface(), null, null); mVirtualDisplay = mMediaProjection.createVirtualDisplay(ScreenCapturer.class.getSimpleName(), width, height, screenDensity, DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR, mImageReader.getSurface(), null, null);
} }
private void refreshImageReader(int width, int height) { private void refreshImageReader(int width, int height) {
@@ -167,10 +168,16 @@ public class ScreenCapturer {
} }
public void setImageListenerAsync(ImageReader imageReader) { public void setImageListenerAsync(ImageReader imageReader) {
if (mOnScreenCaptureAvailableListener != null) { var listener = mOnScreenCaptureAvailableListener;
Image acquireLatestImage = imageReader.acquireLatestImage(); if (listener == null) return;
mOnScreenCaptureAvailableListener.onCaptureAvailable(acquireLatestImage); try (Image img = imageReader.acquireLatestImage()) {
acquireLatestImage.close(); // acquireLatestImage may return null (no available frames/competition/switching).
// zh-CN: acquireLatestImage 可能返回 null (无可用帧/竞争/切换中).
if (img == null) return;
listener.onCaptureAvailable(img);
} catch (IllegalStateException e) {
// Ignore the current frame if ImageReader/VirtualDisplay is switching or closed.
// zh-CN: 当 ImageReader/VirtualDisplay 正在切换或已关闭时可能抛出, 忽略本帧.
} }
} }

View File

@@ -24,6 +24,7 @@ public record ScreenCaptureAvailableHandler(ScriptRuntime scriptRuntime, Images.
@Override @Override
public void onCaptureAvailable(Image image) { public void onCaptureAvailable(Image image) {
if (image == null) return;
Images.setImageCaptureCallback(scriptRuntime, listener, image); Images.setImageCaptureCallback(scriptRuntime, listener, image);
} }
} }

View File

@@ -1,5 +1,5 @@
#Thu Oct 09 17:46:30 CST 2025 #Thu Oct 23 22:53:43 CST 2025
BUILD_TIME=1760003190056 BUILD_TIME=1761231223404
COMPILE_SDK_VERSION=36 COMPILE_SDK_VERSION=36
IMAGE_QUANT_CMAKE_VERSION=3.22.1 IMAGE_QUANT_CMAKE_VERSION=3.22.1
IMAGE_QUANT_NDK_VERSION=26.1.10909125 IMAGE_QUANT_NDK_VERSION=26.1.10909125
@@ -27,6 +27,6 @@ RAPID_OCR_OPENCV_MOBILE_LABEL_VERSION=13
RAPID_OCR_OPENCV_MOBILE_VERSION=4.5.3 RAPID_OCR_OPENCV_MOBILE_VERSION=4.5.3
TARGET_SDK_VERSION=36 TARGET_SDK_VERSION=36
TARGET_SDK_VERSION_INRT=29 TARGET_SDK_VERSION_INRT=29
VERSION_BUILD=3410 VERSION_BUILD=3434
VERSION_NAME=6.7.0 Alpha6 VERSION_NAME=6.7.0 Alpha7
VSCODE_EXT_REQUIRED_VERSION=1.0.8 VSCODE_EXT_REQUIRED_VERSION=1.0.8