在Android 10及更高版本中,处理文件和媒体的方式发生了一些变化。在转换Document Uri到MediaStore Uri时可能会抛出错误。以下是一个解决方法的示例代码:
private Uri convertDocumentUriToMediaStoreUri(Context context, Uri documentUri) {
String filePath = getFilePathFromDocumentUri(context, documentUri);
if (filePath == null) {
return null;
}
Cursor cursor = context.getContentResolver().query(
MediaStore.Files.getContentUri("external"),
new String[]{MediaStore.Files.FileColumns._ID},
MediaStore.Files.FileColumns.DATA + "=?",
new String[]{filePath},
null
);
if (cursor != null && cursor.moveToFirst()) {
long fileId = cursor.getLong(cursor.getColumnIndex(MediaStore.Files.FileColumns._ID));
cursor.close();
return MediaStore.Files.getContentUri("external", fileId);
}
return null;
}
private String getFilePathFromDocumentUri(Context context, Uri documentUri) {
String filePath = null;
String[] projection = {MediaStore.MediaColumns.DATA};
Cursor cursor = null;
try {
cursor = context.getContentResolver().query(documentUri, projection, null, null, null);
if (cursor != null && cursor.moveToFirst()) {
int columnIndex = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.DATA);
filePath = cursor.getString(columnIndex);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (cursor != null) {
cursor.close();
}
}
return filePath;
}
在上面的代码中,convertDocumentUriToMediaStoreUri()
方法将Document Uri转换为MediaStore Uri。它首先调用getFilePathFromDocumentUri()
方法,该方法从Document Uri中获取文件路径。然后,使用文件路径查询MediaStore数据库,获取文件的ID,并构建MediaStore Uri返回。
getFilePathFromDocumentUri()
方法用于从Document Uri中获取文件路径。它通过查询MediaStore数据库获取文件路径,并返回。
在使用这些方法时,您需要传入上下文和要转换的Document Uri。它将返回转换后的MediaStore Uri,或者如果转换失败则返回null。
请确保在使用这些方法之前,您已经获得了适当的权限(如READ_EXTERNAL_STORAGE)来访问文件和媒体。