ファイルの圧縮バックアップをクラウドにアップロードする Android アプリケーションがあります。
最近まで、私は Dropbox だけを使用していましたが、非常にうまく機能していました。
最近、Google ドライブのサポートを実装することにしました。
ファイルが小さい場合 (約 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"
何か案は?
2番目の質問:各チャンクがアップロードされた後に呼び出されるものではなく、線形進行リスナーを取得する方法(ここでは10Mbごと)?