尝试从 URI 获取文件名时发生致命运行时异常

Fatal runtime exception when trying to get filename from URI

在 android studio (API 30) 中尝试 运行 以下 java 代码片段时出现致命异常。我尝试按照 https://developer.android.com/training/secure-file-sharing/retrieve-info

中的这些步骤操作
Uri selectedImageUri = data.getData();
if (selectedImageUri != null) {
    Cursor returnCursor = requireContext().getContentResolver().query(selectedImageUri, 
    null, null, null, null);
    int nameIndex = returnCursor.getColumnIndex(OpenableColumns.DISPLAY_NAME);
    System.out.println(returnCursor.getString(nameIndex));
}
E/AndroidRuntime: FATAL EXCEPTION: main
...
java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1656054214, result=-1, data=Intent { dat=content://com.android.providers.downloads.documents/document/raw:/storage/emulated/0/Download/1.jpg flg=0x1 }} to activity {com.bonmanager/com.bonmanager.MainActivity}: android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 1
...
Caused by: android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 1
...

可能是上下文的问题,但我不知道为什么。以下是一些调试打印:

System.out.println(returnCursor);
-> android.content.ContentResolver$CursorWrapperInner@7cfe38a

System.out.println(nameIndex);
-> 2

默认情况下,Cursor位于第一行之前。在尝试读取值之前对其调用 moveToFirst()

您也可以考虑使用 DocumentFile.fromSingleUri(),然后对结果 DocumentFile 调用 getName(),这与您的代码执行相同的操作。