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

11 回复

我去确认一下

更多关于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

问题分析:

  1. 错误发生在com.dmcbig.mediapicker.data.ImageLoader.onLoadFinished,这是uni-app底层使用的媒体选择器组件
  2. 当访问第3321行数据时,CursorWindow无法读取,说明媒体库查询结果集过大
  3. 在Android 10系统上,媒体库查询机制有所变化,更容易触发此问题

解决方案:

  1. 限制查询数量 在调用uni.chooseImage前,建议设置较小的count值,避免一次性加载过多图片:
uni.chooseImage({
    count: 6, // 减少选择数量
    sizeType: ['compressed'], // 使用压缩图减少内存占用
    sourceType: ['album'],
    success: (res) => {
        console.log(res.tempFilePaths);
    }
});
回到顶部