将Uri转为文件路径
public List convertUrisToPaths(Context context, List uris) {
List paths = new ArrayList<>();
for (Uri uri : uris) {
String path = null;
// 1. 处理 file://
类型(直接获取路径)
if (“file”.equals(uri.getScheme())) {
path = uri.getPath();
}
// 2. 处理 content://
类型(需查询 ContentResolver)
else if (“content”.equals(uri.getScheme())) {
try (Cursor cursor = context.getContentResolver().query(
uri, null, null, null, null)) {
if (cursor != null && cursor.moveToFirst()) {
// 根据 Uri 来源分类处理
if (isMediaDocument(uri)) { // 媒体文件(相册)
String docId = DocumentsContract.getDocumentId(uri);
String[] split = docId.split("😊;
Uri contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
path = queryMediaStorePath(context, contentUri, split[1]);
} else if (isDownloadsDocument(uri)) { // 下载文件
String id = DocumentsContract.getDocumentId(uri);
Uri contentUri = ContentUris.withAppendedId(
Uri.parse(“content://downloads/public_downloads”),
Long.parseLong(id)
);
path = getDataColumn(context, contentUri, null, null);
} else { // 其他 ContentProvider
path = getDataColumn(context, uri, null, null);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
if (path != null) paths.add(path);
}
return paths;
}
// 辅助方法:查询 MediaStore 路径
private String queryMediaStorePath(Context context, Uri baseUri, String id) {
String[] projection = {MediaStore.Images.Media.DATA};
String selection = MediaStore.Images.Media._ID + “=?”;
String[] selectionArgs = {id};
return getDataColumn(context, baseUri, selection, selectionArgs);
}
// 辅助方法:获取 Cursor 中的 _data 字段
private String getDataColumn(Context context, Uri uri, String selection, String[] args) {
Cursor cursor = null;
String column = MediaStore.Images.Media.DATA;
String[] projection = {column};
try {
cursor = context.getContentResolver().query(uri, projection, selection, args, null);
if (cursor != null && cursor.moveToFirst()) {
int index = cursor.getColumnIndexOrThrow(column);
return cursor.getString(index);
}
} finally {
if (cursor != null) cursor.close();
}
return null;
}