尝试从 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()
,这与您的代码执行相同的操作。
在 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()
,这与您的代码执行相同的操作。