【发布时间】:2020-08-31 17:14:01
【问题描述】:
getColumnIndexOrThrow 抛出异常的原因可能是什么
java.lang.IllegalArgumentException:列“_data”不存在。可用列:[]
但是,如果您重命名文件并重试,它会起作用吗?
private static String getDataColumn(Context context, Uri uri, String selection,
String[] selectionArgs) {
Cursor cursor = null;
final String[] projection = {
MediaStore.Files.FileColumns.DATA
};
try {
cursor = context.getContentResolver().query(
uri, projection, selection, selectionArgs, null);
if (cursor != null && cursor.moveToFirst()) {
final int cindex = cursor.getColumnIndexOrThrow(projection[0]);
return cursor.getString(cindex);
}
}
catch (Exception e) {
e.printStackTrace();
} finally {
if (cursor != null)
cursor.close();
}
return null;
}
原始文件的意图是
content://com.sec.android.app.myfiles.FileProvider/device_storage/Download/myfile.pdf
但重命名的文件是
content://0@media/external/file/588
【问题讨论】:
-
因此,如果我只是在原始文件上使用 uri.getPath() 路径返回(无效)为
/device_storage/Download/myFile.pdf这是我的文件打开例程的无效路径,但如果我重命名它然后再试一次它回来了:/storage/emulated/0/Download/myFile.pdf哪个打开文件就好了?想法? -
任何人都知道为什么 MyFiles 应用程序会出现此问题,而其他资源管理器应用程序会发送正确的 getData()?
-
请解释一下您实际上想要做什么?您之前所做的和之后的预期。以及何时抛出此异常。
-
我有一个活动来处理文件的打开并在清单中注册类型,以便我可以用来打开该类型的文件。在一种情况下,getData() 返回如上所示的一个字符串,该字符串不会解析为有效的文件路径。但是,如果我在外部文件导出器中重命名文件并重试,返回的 getData 字符串是有效的。
-
我已经为答案添加了额外的材料。
标签: android android-contentresolver