如何使用 MediaStore Api 从 DocumentFile 对象复制 Images/Videos 到图库文件夹
How to copy Images/Videos from DocumentFile Object to Gallery Folder using MediaStore Api
我使用 Document Tree Intent 获得了对这个文件夹的访问权限:-
content://com.android.externalstorage.documents/tree/primary%3AExampleApp%2FMedia%2F.hiddenMedia
上述文件夹中图像的 URI :-
content://com.android.externalstorage.documents/tree/primary%3AExampleFolder%2FMedia%2F.hiddenMedia/document/primary%3AExampleFolder%2FMedia%2F.hiddenMedia%2FCristiano.jpg
现在我从上面的文件夹中获得了作为 DocumentFile 的图像及其 URI。
DocumentFile documentFile = DocumentFile.fromSingleUri(context, fileUri);
fileUri
是文档文件的 URI。
注意 :- 无法通过 MediaStore 访问文件夹中的文件 API 因为文件夹是隐藏的
通常此文档文件可以是图像或视频文件。
如何使用 MediaStore API.
将 Image/Video 从 DocumentFile 复制到 Pictures/My App
提前致谢!
感谢@blackapps!
我所要做的就是使用 insert()
方法从 MediaStore
请求一个可写 URI,然后为源 URI 打开一个 InputStream
,为目标 URI 打开一个 OutputStream
。
上述操作的代码:-
public void saveFile(Uri sourceUri, String fileName, String mimeType) throws IOException{
ContentValues values = new ContentValues();
Uri destinationUri;
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.P){
values.put(MediaStore.MediaColumns.DISPLAY_NAME, fileName);
values.put(MediaStore.MediaColumns.MIME_TYPE, mimeType);
if (fileName.endsWith(".mp4")){
values.put(MediaStore.MediaColumns.RELATIVE_PATH, Environment.DIRECTORY_MOVIES + "/MyFolder");
destinationUri = context.getContentResolver().insert(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, values);
} else {
values.put(MediaStore.MediaColumns.RELATIVE_PATH, Environment.DIRECTORY_PICTURES + "/MyFolder");
destinationUri = context.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
}
InputStream inputStream = context.getContentResolver().openInputStream(sourceUri);
OutputStream outputStream = context.getContentResolver().openOutputStream(destinationUri);
IOUtils.copy(inputStream, outputStream);
Toast.makeText(context, "The File has been saved!", Toast.LENGTH_SHORT).show();
}
注意:- 您必须在 build.gradle 文件中添加 Commons-io
依赖项才能访问 IOUtils.copy()
函数
如果您找到更好的方法,请分享!
我使用 Document Tree Intent 获得了对这个文件夹的访问权限:-
content://com.android.externalstorage.documents/tree/primary%3AExampleApp%2FMedia%2F.hiddenMedia
上述文件夹中图像的 URI :-
content://com.android.externalstorage.documents/tree/primary%3AExampleFolder%2FMedia%2F.hiddenMedia/document/primary%3AExampleFolder%2FMedia%2F.hiddenMedia%2FCristiano.jpg
现在我从上面的文件夹中获得了作为 DocumentFile 的图像及其 URI。
DocumentFile documentFile = DocumentFile.fromSingleUri(context, fileUri);
fileUri
是文档文件的 URI。
注意 :- 无法通过 MediaStore 访问文件夹中的文件 API 因为文件夹是隐藏的
通常此文档文件可以是图像或视频文件。
如何使用 MediaStore API.
Pictures/My App
提前致谢!
感谢@blackapps!
我所要做的就是使用 insert()
方法从 MediaStore
请求一个可写 URI,然后为源 URI 打开一个 InputStream
,为目标 URI 打开一个 OutputStream
。
上述操作的代码:-
public void saveFile(Uri sourceUri, String fileName, String mimeType) throws IOException{
ContentValues values = new ContentValues();
Uri destinationUri;
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.P){
values.put(MediaStore.MediaColumns.DISPLAY_NAME, fileName);
values.put(MediaStore.MediaColumns.MIME_TYPE, mimeType);
if (fileName.endsWith(".mp4")){
values.put(MediaStore.MediaColumns.RELATIVE_PATH, Environment.DIRECTORY_MOVIES + "/MyFolder");
destinationUri = context.getContentResolver().insert(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, values);
} else {
values.put(MediaStore.MediaColumns.RELATIVE_PATH, Environment.DIRECTORY_PICTURES + "/MyFolder");
destinationUri = context.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
}
InputStream inputStream = context.getContentResolver().openInputStream(sourceUri);
OutputStream outputStream = context.getContentResolver().openOutputStream(destinationUri);
IOUtils.copy(inputStream, outputStream);
Toast.makeText(context, "The File has been saved!", Toast.LENGTH_SHORT).show();
}
注意:- 您必须在 build.gradle 文件中添加 Commons-io
依赖项才能访问 IOUtils.copy()
函数
如果您找到更好的方法,请分享!