使用 Android Studio 中的 Google Drive API 从驱动器下载文件以上传到另一个驱动器

问题描述

因此,在我的应用程序中,我需要从用户的驱动器中获取一个文件并将其上传到我的驱动器中。

我已经搜索过,似乎唯一的方法是从用户的驱动器下载文件,然后将其上传到我的驱动器。

我已经解决了所有的 OAuth2,我可以创建、获取和列出文件

但我的问题是,根据谷歌的文档,我应该将文件下载到声明为 OutputStream 的 ByteArrayOutputStream,但是当我上传文件时,我应该上传一个 java.io 文件

有谁知道我如何从下载方法获取输出流并将其转换为文件以发送到上传方法

这是我目前的代码

下载文件代码(我从谷歌得到的)

 public Task<java.io.File> downloadFile(PostFileHolder postFileHolder) {
        return Tasks.call(mExecutor,() -> {
            // Retrieve the Metadata as a File object.

            Log.i("download file","chegou");

            OutputStream outputStream = new ByteArrayOutputStream();
            mDriveService.files().export(postFileHolder.getGoogleId(),"application/pdf")
                    .executeMediaAndDownloadTo(outputStream);
          // I need to use the export method because I will have some docs and slides files

            return null;
        });
    }

这是上传文件代码

public Task<File> uploadFileWithMetadata(java.io.File javaFile,String mimeType,boolean isSlide,@Nullable final String folderId) {
        return Tasks.call(mExecutor,() -> {

            Log.i("upload file","chegou" );

            String convertTo;
            if(isSlide){
                convertTo = TYPE_GOOGLE_SLIDES;
            }
            else{
                convertTo = TYPE_GOOGLE_DOCS;
            }

            List<String> folder;
            if (folderId == null) {
                folder = Collections.singletonList("root");
            } else {

                folder = Collections.singletonList(folderId);
            }
            File Metadata = new File()
            .setParents(folder)
            .setName(javaFile.getName())
            .setMimeType(convertTo);

            FileContent mediaContent = new FileContent(convertTo,javaFile);

            File uploadedFile = mDriveService.files().create(Metadata,mediaContent)
                    .setFields("id,name,size,createdTime,modifiedTime,starred,thumbnailLink,mimeType")
                    .execute();

            Log.i("File ID: ",uploadedFile.getId());

            return uploadedFile;
        });
    }

谢谢!

解决方法

您可以简单地使用以下最少的代码来创建文件。稍后使用此文件上传。

val outputStream = ByteArrayOutputStream() // Your 
val byteData = bos.toByteArray()


val mainFile = File("Path with filename")
//write the bytes in file
val fos = FileOutputStream(mainFile)
fos.write(bitmapdata)
fos.flush()
fos.close()

由于您的 outputStream 被初始化为 ByteArrayOutputStream,因此您可以简单地使用强制转换方法,例如 ((ByteArrayOutputStream) outputStream).toByteArray()

关于路径,您可以将文件保存在内部文件目录或外部存储中的任何位置作为临时文件。我建议您阅读 Data and File Storage Overviewthis 教程以获取更多信息。