【问题标题】:Uploading and downloading multiple files back to back - Android Google Drive api背靠背上传和下载多个文件 - Android Google Drive api
【发布时间】:2017-05-02 15:28:49
【问题描述】:

在我的应用程序中,我需要上传多个文件(1 个 sqlite db 文件和多个图像文件)用于备份到用户的谷歌驱动器。 我正在使用 android google drive api,但不确定如何进行背靠背文件上传,然后再进行类似的下载。

db 文件显然来自 /data/data//databases 类的目录,而图像存储在图片目录中。我需要把所有这些都一一抓取并上传到驱动器。

此外,我已经看到,如果给定文件(具有相同标题)已经存在,即使那样,也会在驱动器上创建一个具有相同标题的新文件(显然 DriveId 不同但标题相同)。我想检查该文件是否存在,如果不存在则仅上传,否则跳过该文件。

请帮忙..我一直在尝试通过google参考github上的android演示,但只能使用它来做点点滴滴。

【问题讨论】:

    标签: android google-drive-api google-drive-android-api


    【解决方案1】:

    文件标题在 Drive API 中不是唯一的。但是,您可以将新创建​​文件的 ID 保存在应用的本地存储中,以便在您想再次上传文件时检查 Drive 端的 ID。

    您可以使用来自 Google Drive 演示 GitHub 页面的 CreateFileActvity.java。创建文件成功后,它会返回一个文件ID,因此您可以将ID存储在本地存储中。

    来自CreateFileActivity.java的示例代码:

    final private ResultCallback<DriveFileResult> fileCallback = new
                ResultCallback<DriveFileResult>() {
            @Override
            public void onResult(DriveFileResult result) {
                if (!result.getStatus().isSuccess()) {
                    showMessage("Error while trying to create the file");
                    return;
                }
                showMessage("Created a file with content: " + result.getDriveFile().getDriveId());
            }
        };
    

    【讨论】:

    • 我可以使用 github 示例中给出的方法,但是没有搜索结果告诉我,如何完成重复文件上传。这种方法的问题是,一旦写入文件并返回文件ID,连接就会关闭。我想一个接一个地上传多个文件,但我找不到解决方法。
    【解决方案2】:

    以防万一有人正在寻找如何将多个文件上传到云端硬盘,这里有一个适合我的解决方案:

    for(String fileName: fileNameArrayList){backupImage(fileName);}
    
     private void backupImage(String fileName) {
        Drive.DriveApi.newDriveContents(mGoogleApiClient).setResultCallback(
                new BackupImagesContentsCallback(mContext, mGoogleApiClient, fileName));
    }
    

    备份回调:

    public class BackupImagesContentsCallback implements ResultCallback<DriveApi.DriveContentsResult> {
    
    @Override
    public void onResult(@NonNull DriveApi.DriveContentsResult driveContentsResult) {
        if (!driveContentsResult.getStatus().isSuccess()) {
            Log.v(TAG, "Error while trying to backup images");
            return;
        }
    
        MetadataChangeSet changeSet = new MetadataChangeSet.Builder()
                .setTitle(mFileName) // Google Drive File name
                .setMimeType("image/jpeg")
                .setStarred(true).build();
    
        Drive.DriveApi.getAppFolder(mGoogleApiClient)
                .createFile(mGoogleApiClient, changeSet, driveContentsResult.getDriveContents())
                .setResultCallback(backupImageFileCallback);
    }
    
    final private ResultCallback<DriveFolder.DriveFileResult> backupImageFileCallback = new ResultCallback<DriveFolder.DriveFileResult>() {
        @Override
        public void onResult(@NonNull DriveFolder.DriveFileResult result) {
            if (!result.getStatus().isSuccess()) {
                Log.v(TAG, "Error while trying to backup images");
                return;
            }
            DriveFile mImageFile;
            mImageFile = result.getDriveFile();
            mImageId = result.getDriveFile().getDriveId();
            mImageFile.open(mGoogleApiClient, DriveFile.MODE_WRITE_ONLY, (bytesDownloaded, bytesExpected) -> {
            }).setResultCallback(backupImagesContentsOpenedCallback);
        }
    };
    
    final private ResultCallback<DriveApi.DriveContentsResult> backupImagesContentsOpenedCallback =
            new ResultCallback<DriveApi.DriveContentsResult>() {
                @Override
                public void onResult(@NonNull DriveApi.DriveContentsResult result) {
                    if (!result.getStatus().isSuccess()) {
                        return;
                    }
    
                    DriveContents contents = result.getDriveContents();
                    BufferedOutputStream bos = new BufferedOutputStream(contents.getOutputStream());
                    byte[] buffer = new byte[1024];
                    int n;
    
                    File imageDirectory = new File(mContext.getFilesDir(),
                            Constants.IMAGE_DIRECTORY_NAME);
    
                    try {
                        FileInputStream is = new FileInputStream(new File(imageDirectory,
                                mFileName));
                        BufferedInputStream bis = new BufferedInputStream(is);
    
                        while ((n = bis.read(buffer)) > 0) {
                            bos.write(buffer, 0, n);
                        }
                        bos.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
    
                    contents.commit(mGoogleApiClient, null);
                }
            };
    }
    

    这不是完美的解决方案,只是一个有效的代码。

    【讨论】:

      猜你喜欢
      • 2015-11-17
      • 1970-01-01
      • 2018-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-05
      相关资源
      最近更新 更多