uni-app nvue 安卓选择图片崩溃,出现 java.lang.IllegalStateException Couldn't read row 3321, col 0 from CursorWindow
uni-app nvue 安卓选择图片崩溃,出现 java.lang.IllegalStateException Couldn’t read row 3321, col 0 from CursorWindow
| 开发环境 | 版本号 | 项目创建方式 |
|---|---|---|
| Mac | macOS 11.2.3 | HBuilderX |
产品分类:uniapp/App
PC开发环境操作系统:Mac
PC开发环境操作系统版本号:macOS Big Sur 11.2.3
HBuilderX类型:正式
HBuilderX版本号:3.1.18
手机系统:Android
手机系统版本号:Android 10
手机厂商:华为
手机机型:YAL-AL00 (荣耀20)
页面类型:nvue
打包方式:云端
项目创建方式:HBuilderX
### 示例代码:
```javascript
uni.chooseImage({
count: 9,
sizeType: ['original'], // 可以指定是原图还是压缩图,默认二者都有
sourceType: ['album', 'camera'], // 从相册选择
success: ({ tempFiles, tempFilePaths }) => {
console.log(tempFiles, tempFilePaths);
}
})
操作步骤:
- 调用选择图片,uni.chooseImage
预期结果:
- 安卓不崩溃
实际结果:
- 偶现的选择图片时,安卓崩溃
bug描述:
错误摘要
java.lang.IllegalStateException
Couldn't read row 3321, col 0 from CursorWindow. Make sure the Cursor is initialized correctly before accessing data from it.
com.dmcbig.mediapicker.data.ImageLoader.onLoadFinished(SourceFile:7)
详细日志
Process Name: '包名'
Thread Name: 'main'
Back traces starts.
java.lang.IllegalStateException: Couldn't read row 3321, col 0 from CursorWindow. Make sure the Cursor is initialized correctly before accessing data from it.
at android.database.CursorWindow.nativeGetString(Native Method)
at android.database.CursorWindow.getString(CursorWindow.java:469)
at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:53)
at android.database.CursorWrapper.getString(CursorWrapper.java:141)
at com.dmcbig.mediapicker.data.ImageLoader.onLoadFinished(SourceFile:7)
at android.app.LoaderManagerImpl$LoaderInfo.callOnLoadFinished(LoaderManager.java:497)
at android.app.LoaderManagerImpl$LoaderInfo.onLoadComplete(LoaderManager.java:465)
at android.content.Loader.deliverResult(Loader.java:157)
at android.content.CursorLoader.deliverResult(CursorLoader.java:116)
at android.content.CursorLoader.deliverResult(CursorLoader.java:46)
at android.content.AsyncTaskLoader.dispatchOnLoadComplete(AsyncTaskLoader.java:274)
at android.content.AsyncTaskLoader$LoadTask.onPostExecute(AsyncTaskLoader.java:97)
at android.os.AsyncTask.finish(AsyncTask.java:797)
at android.os.AsyncTask.access$900(AsyncTask.java:195)
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:814)
at android.os.Handler.dispatchMessage(Handler.java:110)
at android.os.Looper.loop(Looper.java:219)
at android.app.ActivityThread.main(ActivityThread.java:8393)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1055)
Back traces ends.


更多关于uni-app nvue 安卓选择图片崩溃,出现 java.lang.IllegalStateException Couldn't read row 3321, col 0 from CursorWindow的实战教程也可以访问 https://www.itying.com/category-93-b0.html
我去确认一下
更多关于uni-app nvue 安卓选择图片崩溃,出现 java.lang.IllegalStateException Couldn't read row 3321, col 0 from CursorWindow的实战教程也可以访问 https://www.itying.com/category-93-b0.html
你的问题 跟刚贴出来的还不太一样。 先处理你的问题。
你的终端机型是什么。我测试一下
YAL-AL00 (荣耀20) 安卓10
回复 青阳_1900: 必现?
回复 DCloud_Android_DQQ: 看这个异常日志的记录,这个用户是挺频繁的
回复 DCloud_Android_DQQ: 我补充了日志接收时间的图片
回复 青阳_1900: 我们产品是做图片有关的,所以用户一般会选择并上传一些比较大的图片,最大可能有15~20Mb
我这边在华为的远程真机上测试荣耀20 没复现问题。 代码上看这附件代码也什么明显问题,
你这边最好能提供一个 可以复现问题的实例
问题是整体上看是偶现的,我让产品放量给用户,跑一周再看看异常采集
这是一个典型的Android CursorWindow内存限制导致的异常。当相册中图片数量过多时,系统在加载媒体库数据时会超出CursorWindow的默认大小限制(通常为2MB),从而引发IllegalStateException。
问题分析:
- 错误发生在
com.dmcbig.mediapicker.data.ImageLoader.onLoadFinished,这是uni-app底层使用的媒体选择器组件 - 当访问第3321行数据时,CursorWindow无法读取,说明媒体库查询结果集过大
- 在Android 10系统上,媒体库查询机制有所变化,更容易触发此问题
解决方案:
- 限制查询数量
在调用
uni.chooseImage前,建议设置较小的count值,避免一次性加载过多图片:
uni.chooseImage({
count: 6, // 减少选择数量
sizeType: ['compressed'], // 使用压缩图减少内存占用
sourceType: ['album'],
success: (res) => {
console.log(res.tempFilePaths);
}
});

