I'm using google drive api to store some files in google drive app folder, However on some devices when I try to download the files it simply returns the files with size of 0 byte.
upload code:
/**
* It's a blocking method
*
* @param file the file to upload to google drive.
*/
private boolean uploadToDrive(@NonNull File file) {
final DriveApi.DriveContentsResult driveContentsResult = Drive.DriveApi
.newDriveContents(mGoogleApiClient)
.await();
// If the operation was not successful, we cannot do anything and must fail.
if (!driveContentsResult.getStatus().isSuccess()) {
Logger.t(TAG).e("Failed to create new contents.");
return false;
}
// Otherwise, we can write our data to the new contents.
Logger.t(TAG).i("New empty contents created.");
//Creates a file in app folder with provided metadata.
final DriveFolder.DriveFileResult driveFileResult = Drive.DriveApi
.getAppFolder(mGoogleApiClient)
.createFile(mGoogleApiClient, getDatabaseMeta(file.getName().replace("temp-", "")), driveContentsResult.getDriveContents())
.await();
if (!driveContentsResult.getStatus().isSuccess()) {
Logger.t(TAG).e("Error while trying to create the file in app folder.");
return false;
}
final DriveApi.DriveContentsResult contentsResult = driveFileResult
.getDriveFile()
.open(mGoogleApiClient, DriveFile.MODE_WRITE_ONLY, null)
.await();
if (!contentsResult.getStatus().isSuccess()) {
Logger.t(TAG).e("cant create a file in app folder");
return false;
}
final DriveContents driveContents = contentsResult.getDriveContents();
if (!writeFileToDrive(file, driveContents)) {
Logger.t(TAG).e("Cannot read or write to file");
return false;
}
final Status status = driveContents.commit(mGoogleApiClient, null).await();
if (!status.getStatus().isSuccess()) {
Logger.t(TAG).e("Cannot upload the file to drive");
return false;
}
// TODO: 2016-01-19 Store this to use this this file later.
Logger.t(TAG).e("getDriveId:" + driveFileResult.getDriveFile().getDriveId().encodeToString());
return true;
}
/**
* Write the source file to destination drive contents file.
*
* @param file the source {@link File} to read from.
* @param driveContents the destination {@link DriveContents} to write to.
*/
private boolean writeFileToDrive(File file, DriveContents driveContents) {
try {
FileInputStream is = new FileInputStream(file);
BufferedInputStream in = new BufferedInputStream(is);
byte[] buffer = new byte[8 * 1024];
BufferedOutputStream out = new BufferedOutputStream(driveContents.getOutputStream());
int n;
while ((n = in.read(buffer)) > 0) {
out.write(buffer, 0, n);
}
in.close();
is.close();
out.close();
return true;
} catch (IOException e) {
e.printStackTrace();
return false;
}
}
download code:
@Nullable
private DriveContents downloadFileFromDrive(@NonNull DriveId driveId) {
final DriveApi.DriveContentsResult driveContentsResult = driveId.asDriveFile().open(mGoogleApiClient, DriveFile.MODE_READ_ONLY, new DriveFile.DownloadProgressListener() {
@Override
public void onProgress(long bytesDownloaded, long bytesExpected) {
Log.d(TAG, "onProgress() called with: bytesDownloaded = [" + bytesDownloaded + "], bytesExpected = [" + bytesExpected + "]");
}
}).await();
if (!driveContentsResult.getStatus().isSuccess()) {
Logger.t(TAG).e("Cannot download the file");
return null;
}
return driveContentsResult.getDriveContents();
}
/**
* Writes the drive contents to the destination file.
*
* @param source
* @param destination
* @return true if the write is successful.
*/
private boolean writeFileToDisk(@NonNull DriveContents source, @NonNull File destination) {
try {
final InputStream in = source.getInputStream();
final BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(destination));
byte[] buffer = new byte[8 * 1024];
int n;
while ((n = in.read(buffer)) > 0) {
out.write(buffer, 0, n);
}
out.close();
in.close();
return true;
} catch (IOException e) {
e.printStackTrace();
return false;
}
}
The uploaded file is downloaded correctly in emulators and most devices, but on some devices it is downloaded with 0 byte file size.
Actually when I upload a file from a device with this problem and then I request to download it with the same device again, I receive a file with zero length from cache, if I try to download that file from another device which has this problem it just download it without an issue.
I think something is wrong with its caching strategy, It just check if the file already exists in the cache and returns it with 0 byte size.
The devices I have this issue with are api 21 and below.
Google Drive Api 9.2.1
Google Play Services 9.4.52 Date: 19 Jul 2016 Latest version