我们正在尝试获取保存在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
}
答案 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)获得访问权限。