上传和下载多个文件背靠背 - Android Google Drive api

时间:2014-12-04 17:22:28

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

在我的应用中,我需要上传多个文件(1个sqlite数据库文件和多个图像文件),以备用于用户的谷歌硬盘。 我正在使用android google drive api,但不确定,如何做背靠背文件上传,然后再下载这样的下载。

db文件显然来自/ data / data //数据库类目录,而图像存储在图片目录中。我需要逐个抓住所有这些并上传到驱动器。

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

请帮助..我一直试图通过谷歌推荐github上的android演示,但是只能用它来做点点滴滴。

2 个答案:

答案 0 :(得分:2)

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

您可以使用Google云端硬盘演示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());
        }
    };

答案 1 :(得分: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);
            }
        };
}

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