如何使用 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() 函数

如果您找到更好的方法,请分享!