Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 通过文件浏览器选择文件后,如何在onActivityResult()中使用getContentResolver().query()获取文件路径_Java_Android - Fatal编程技术网

Java 通过文件浏览器选择文件后,如何在onActivityResult()中使用getContentResolver().query()获取文件路径

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

通常情况下,对于图片,我通过在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 = 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
文档了解如何做到这一点