Java 通过文件浏览器选择文件后,如何在onActivityResult()中使用getContentResolver().query()获取文件路径
通常情况下,对于图片,我通过在activityResult()中使用以下代码来获得它,它工作正常:Java 通过文件浏览器选择文件后,如何在onActivityResult()中使用getContentResolver().query()获取文件路径,java,android,Java,Android,通常情况下,对于图片,我通过在activityResult()中使用以下代码来获得它,它工作正常: Uri photoUri = data.getData(); Cursor cursor = null; String filePath = ""; // Use are cursor to get the filePath try { String[] filePathColumn = {MediaStore.Images.Media.DATA}; cursor = getAc
Uri photoUri = data.getData();
Cursor cursor = null;
String filePath = "";
// Use are cursor to get the filePath
try {
String[] filePathColumn = {MediaStore.Images.Media.DATA};
cursor = getActivity().getContentResolver().query(photoUri, filePathColumn, null, null, null);
if (cursor != null && cursor.moveToFirst()) {
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
filePath = cursor.getString(columnIndex);
}
} catch (Exception ex) {
LogHelper.LogError("DialogUpsertPictureFragment error.", ex);
} finally {
if (cursor != null)
cursor.close();
}
然而,当我尝试对文件执行类似操作时,不知何故,光标总是返回null
。区别在于getContentResolver().query()
的projection
参数。我将投影
从MediaStore.Images.Media.DATA
更改为MediaStore.Files.FileColumns.DATA
。以下是我尝试过的:
Uri uri = data.getData();
Cursor cursor = null;
String filePath = "";
try {
String[] filePathColumn = {MediaStore.Files.FileColumns.DATA};
cursor = getActivity().getContentResolver().query(uri, filePathColumn, null, null, null);
if (cursor != null && cursor.moveToFirst()) {
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
filePath = cursor.getString(columnIndex);
}
} catch (Exception ex) {
LogHelper.LogError("DialogUpsertAttachmentFragment error.", ex);
} finally {
if (cursor != null)
cursor.close();
}
有人知道吗?如果您已经在清单文件中定义了和,那么这行代码应该为您提供文件路径:
String filePath = uri.getPath();
通常情况下,我们不会试图找到路径。。。通常我们从谷歌网站上获取内容的目的是:如何消费内容uri@Selvin但是我们也可以得到磁盘上文件的路径。我们不能吗?因此,最终,我可以通过filemediafile=newfile(filePath)来管理它代码>?如果您真的、真的、真的、真的需要一个路径(我对此表示怀疑),那么创建新文件并复制内容您需要的是InputStream
,而不是file
-请参阅ContentResolver
文档了解如何做到这一点