我有一个 Android 应用程序,可以将您的文件的压缩备份上传到云端。
直到最近,我还专门使用 Dropbox,它运行良好。
最近我决定实现对 Google Drive 的支持。
当文件很小(大约 15Mb)时,它正在工作......大部分时间(有时在上传开始后我会收到 401 错误)。
当文件很大(> 1Gb)时,我总是会收到错误消息:
java.io.IOException: unexpected end of stream
这是我的代码:
public CloudResult sendFile(File fileContent, long added) {
CloudResult result = new CloudResult();
try {
mProgress = new FileUploadProgressListener(fileContent.getName());
mediaContent = new FileContent(ZIP_MIME_TYPE, fileContent);
com.google.api.services.drive.model.File body = new com.google.api.services.drive.model.File();
body.setTitle(fileContent.getName());
body.setMimeType(ZIP_MIME_TYPE);
Drive.Files.Insert inserted = getDrive().files().insert(body, mediaContent);
inserted.getMediaHttpUploader()
.setDirectUploadEnabled(false)
.setChunkSize(MediaHttpUploader.DEFAULT_CHUNK_SIZE)
.setProgressListener(mProgress);
com.google.api.services.drive.model.File f = inserted.execute();
// loop over all files in drive and see if any need to be
// synced locally
FileList driveFilesList = getDrive().files().list().execute();
mTotalUploaded = added;
for (com.google.api.services.drive.model.File remote : driveFilesList.getItems()) {
Log.d(Ln.TAG, remote.getLabels().toPrettyString());
}
} catch (IOException e) {
result = new CloudResult(getClass().getSimpleName() + " - " + e.getLocalizedMessage());
if (Ln.DEBUG) {
Log.e(Ln.TAG, "Error in GDrive - " + e.getLocalizedMessage(), e);
}
}
return result;
}
由于我对 InputStream 没有真正的控制权,所以我不知道该怎么做。
在此过程中,我已经开启了一些唤醒器。
一切都在服务内的线程中执行。该服务与 Dropbox 相同,因此错误与此代码的执行方式无关。它在别的地方,但我不知道在哪里!可能是 GDrive 的错误。
我找到了这些线程,但没有真正的答案: Uploading jpeg to Google Drive from Android app "unexpected end of stream"
有任何想法吗?
第二个问题:如何获得一个线性进度监听器,而不是在每个块上传后调用的东西(这里每 10Mb)?