Android:从SD卡中文件的Uri获取文件路径

时间:2019-12-02 06:12:59

标签: android sd-card android-external-storage

我们正在尝试获取保存在SD卡中的文件的路径,以传递给实用程序。但是,当我们使用URI打开游标时,仅提取了两列,路径(_data列)丢失了。请让我知道如何获取路径。该查询对内部存储中的任何文件都适用。

方案是“内容”。

代码段

cursor = context.getContentResolver().query(uri, null, null, null, null);
if (null != cursor && cursor.moveToFirst())
{
    int testcolCount = cursor.getColumnCount();
    for (int i = 0; i < testcolCount; i++)
    {
        String colName = cursor.getColumnName(i);
        String colValue = cursor.getString(i);
        System.out.println("" + i + ": " + colName + ":" + colValue + "\n");
    }

    //This prints only two columns, _display_name and _size
}

3 个答案:

答案 0 :(得分:2)

尝试此代码,我正在使用此功能从uri获取真实路径:

private String getRealPathFromURI(Context mContext, Uri contentURI) {
    String result = null;
    Cursor cursor = null;
    try {
        String[] proj = {MediaStore.Video.Media.DATA};
        ContentResolver mContentResolver = mContext.getContentResolver();
        String mime = mContentResolver.getType(contentURI);
        cursor = mContentResolver.query(contentURI, proj, null, null, null);
        if (cursor == null) {
            return null;
        } else {
            cursor.moveToFirst();
            int column_index = cursor.getColumnIndex(MediaStore.Images.Media.DATA);
            if (column_index > -1)
                result = cursor.getString(column_index);
            cursor.close();
        }
    } catch (Exception e) {
        return null;
    } finally {
        if (cursor != null)
            cursor.close();
    }
    return result;
}

它将返回一个字符串,它是文件的真实路径。

希望它会对您有所帮助。

答案 1 :(得分:0)

默认的文件管理器是导致此问题的文件管理器-不返回“ DATA”列,也不以“ com.lenovo.FileBrowser.FileProvider”返回授权。当我使用另一个文件管理器时,授权机构是“媒体”。在运行ContenResolver时,还使用“ DATA”获取了路径列。感谢所有人的努力。

答案 2 :(得分:0)

根本不要尝试获取路径,对于Android 10及更高版本,应用程序的私有目录之外的文件路径是无用的,因为您无权访问它们。

请参见https://developer.android.com/training/data-storage#scoped-storage

使用contentResolver获取FileDescriptor并传递到实用程序

来自https://developer.android.com/reference/android/provider/MediaStore.MediaColumns.html#DATA的注释

  

此常量在API级别29中已弃用。   应用程序可能没有文件系统权限来直接访问此路径。应用程序不应尝试直接打开此路径,而应使用ContentResolver#openFileDescriptor(Uri,String)获得访问权限。

相关问题