You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android API30下从URI获取文件名时出现致命运行时异常求助

问题根因

你触发CursorIndexOutOfBoundsException的核心原因是没有移动Cursor的指针到有效数据行就直接读取数据。
Android系统返回的Cursor初始指针位置是-1(指向第一行数据之前的位置),哪怕你的Cursor有数据(崩溃日志里已经显示size=1,说明确实存在1条有效数据),直接调用getString()等读取方法也会抛出下标越界异常。

修复方案

你需要在读取Cursor数据前,先调用moveToFirst()校验数据存在并把指针移到第一行,同时用完Cursor要主动关闭避免内存泄漏,修正后的代码如下:

Uri selectedImageUri = data.getData();
if (selectedImageUri != null) {
    Cursor returnCursor = requireContext().getContentResolver().query(selectedImageUri, 
            null, null, null, null);
    // 先校验Cursor非空,再移动指针到第一行
    if (returnCursor != null && returnCursor.moveToFirst()) {
        int nameIndex = returnCursor.getColumnIndex(OpenableColumns.DISPLAY_NAME);
        // 额外增加列存在校验,避免列不存在导致的异常
        if (nameIndex >= 0) {
            System.out.println(returnCursor.getString(nameIndex));
        }
        returnCursor.close(); // 用完主动关闭Cursor
    }
}

补充说明

你之前猜测的context相关问题不成立,你打印的Cursor实例、nameIndex取值均正常,所有报错均为指针位置错误导致。

内容的提问来源于stack exchange,提问作者Markus Peterson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 19:06:03