在我的应用中,我需要上传多个文件(1个sqlite数据库文件和多个图像文件),以备用于用户的谷歌硬盘。 我正在使用android google drive api,但不确定,如何做背靠背文件上传,然后再下载这样的下载。
db文件显然来自/ data / data //数据库类目录,而图像存储在图片目录中。我需要逐个抓住所有这些并上传到驱动器。
另外,我已经看到,如果一个给定的文件(具有相同的标题)已经存在,即使这样,也会在驱动器上创建一个具有相同标题的新文件(显然有diff DriveId但标题相同)。我想检查一下,如果该文件存在并且只在不存在的情况下上传,否则跳过该文件。
请帮助..我一直试图通过谷歌推荐github上的android演示,但是只能用它来做点点滴滴。
答案 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);
}
};
}
这不是完美的解决方案,只是一个有效的代码。