2

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

M. Reza Nasirloo
  • 16,434
  • 2
  • 29
  • 41

1 Answers1

0

I have same Error. And I found that, DriveId i want to download is a 'preliminary' DriveId (Follow this resourceID of file is null). I saved that 'preliminary' DriveId to my Database, and cant download that file. I fix this by receiving CompletionEvents when create and edit file, to get real resourceID of file when GDAA commit file to Drive (by receiving Completion Events). Sorry for my bad English.

Community
  • 1
  • 1
ManhPhi
  • 31
  • 7