Google Drive API для Android возвращает пустой файл

android google-play-services google-drive-android-api drive

496 просмотра

1 ответ

Я использую google drive api для хранения некоторых файлов в папке приложения google drive, однако на некоторых устройствах при попытке загрузить файлы просто возвращает файлы размером 0 байт.

загрузить код:

/**
 * 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;
    }
}

скачать код:

@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;
    }
}

Загруженный файл загружается правильно в эмуляторах и на большинстве устройств, но на некоторых устройствах он загружается с размером файла 0 байт.

На самом деле, когда я загружаю файл с устройства с этой проблемой, а затем запрашиваю его загрузку с того же устройства, я получаю файл нулевой длины из кеша, если я пытаюсь загрузить этот файл с другого устройства, у которого есть эта проблема просто скачайте его без проблем.

Я думаю, что-то не так с его стратегией кэширования. Он просто проверяет, существует ли файл в кэше, и возвращает его с размером 0 байт.

Устройства, с которыми я столкнулся с этой проблемой, - api 21 и ниже.

Google Drive Api 9.2.1

Сервисы Google Play 9.4.52 Дата: 19 июля 2016 г. Последняя версия

Автор: M. Reza Nasirloo Источник Размещён: 08.11.2019 11:05

Ответы (1)


0 плюса

У меня такая же ошибка. И я обнаружил, что DriveId, который я хочу загрузить, является «предварительным» DriveId (следуйте по этому resourceID файла - null ). Я сохранил этот предварительный DriveId в свою базу данных и не могу загрузить этот файл. Я исправляю это, получая CompletionEvents при создании и редактировании файла, чтобы получить реальный идентификатор ресурса файла, когда GDAA фиксирует файл на диск ( получая события завершения ). Извините за мой плохой английский.

Автор: ManhPhi Размещён: 31.08.2016 03:36
Вопросы из категории :
32x32