检查上传进度&;下载(适用于Android或Java的Google Drive API)

检查上传进度&;下载(适用于Android或Java的Google Drive API),java,android,google-drive-api,Java,Android,Google Drive Api,如何检查使用GoogleDrive API的上传进度 service.files().insert(body,mediaContent.execute()仅返回一个文件,我们可以检查该文件是否已完全上载 但我需要实时检查进度(至少每秒钟左右),无论如何,这样做 对于下载部分,我认为我们可以手动比较从inputstream读取的字节数和总文件大小,然后计算当前的进度 Drive.Files.Insert insert = service.files().insert(body, mediaCont

如何检查使用GoogleDrive API的上传进度

service.files().insert(body,mediaContent.execute()仅返回一个文件,我们可以检查该文件是否已完全上载

但我需要实时检查进度(至少每秒钟左右),无论如何,这样做

对于下载部分,我认为我们可以手动比较从inputstream读取的字节数和总文件大小,然后计算当前的进度

Drive.Files.Insert insert = service.files().insert(body, mediaContent);
MediaHttpUploader uploader = insert.getMediaHttpUploader();
uploader.setDirectUploadEnabled(false);
uploader.setChunkSize(10*1024*1024); // previously I am using 1000000 thats why it won't work
uploader.setProgressListener(new FileUploadProgressListener());
com.google.api.services.drive.model.File f = insert.execute();
但这是正确的方法吗?还是有其他更好的方法来检查进度

private void saveFileToDrive() {
    Thread t = new Thread(new Runnable() {
      @Override
      public void run() {
        try {
          // File's binary content
          java.io.File fileContent = new java.io.File(fileUri.getPath());
          FileContent mediaContent = new FileContent("image/jpeg", fileContent);

          // File's metadata.
          File body = new File();
          body.setTitle(fileContent.getName());
          body.setMimeType("image/jpeg");

          File file = service.files().insert(body, mediaContent).execute();
          if (file != null) {
            showToast("Photo uploaded: " + file.getTitle());
            //startCameraIntent();
          }
        } catch (UserRecoverableAuthIOException e) {
          startActivityForResult(e.getIntent(), REQUEST_AUTHORIZATION);
        } catch (IOException e) {
          e.printStackTrace();
        }
      }
    });
    t.start();
  }
编辑:使用此代码

如果我使用可恢复上传,我现在可以取得一些进展,我将chunksize设置为1MB。 但是现在有两个问题

1) 可恢复的上传速度比单次上传慢得多,因为它会在两次上传之间多次停止,每次只发送1MB。
如果我将chunksize设置为更高的值,则对于较小的文件,它根本不会显示进度。
所以,可恢复上传的进展并不是我真正想要的。我想在单上传的进展

2) 如果我将chunksize设置为1MB左右,那么对于一个正常的10MB文件,我的上传总是以大约70%的速度失败。
如果我将chunksize设置为10MB,那么它将成功,但我看不到任何进展

Drive.Files.Insert insert = service.files().insert(body, mediaContent);
MediaHttpUploader uploader = insert.getMediaHttpUploader();
uploader.setDirectUploadEnabled(false);
uploader.setChunkSize(10*1024*1024); // previously I am using 1000000 thats why it won't work
uploader.setProgressListener(new FileUploadProgressListener());
com.google.api.services.drive.model.File f = insert.execute();
LogCat错误:

11-27 19:23:26.927: D/FileUploadProgressListener(11527): Upload is In Progress: 0.5235538030501893
11-27 19:23:33.692: D/FileUploadProgressListener(11527): Upload is In Progress: 0.56095050326806
11-27 19:23:38.294: D/FileUploadProgressListener(11527): Upload is In Progress: 0.5983472034859306
11-27 19:23:50.583: D/FileUploadProgressListener(11527): Upload is In Progress: 0.6357439037038013
11-27 19:23:55.091: D/FileUploadProgressListener(11527): Upload is In Progress: 0.673140603921672
11-27 19:24:05.130: D/FileUploadProgressListener(11527): Upload is In Progress: 0.7105373041395426
11-27 19:24:17.005: D/FileUploadProgressListener(11527): Upload is In Progress: 0.7479340043574133
11-27 19:24:28.888: D/FileUploadProgressListener(11527): Upload is In Progress: 0.785330704575284
11-27 19:24:28.896: W/HttpTransport(11527): exception thrown while executing request
11-27 19:24:28.896: W/HttpTransport(11527): java.io.IOException: unexpected end of stream
11-27 19:24:28.896: W/HttpTransport(11527):     at libcore.net.http.FixedLengthOutputStream.close(FixedLengthOutputStream.java:58)
11-27 19:24:28.896: W/HttpTransport(11527):     at com.google.api.client.http.javanet.NetHttpRequest.execute(NetHttpRequest.java:88)
11-27 19:24:28.896: W/HttpTransport(11527):     at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:980)
11-27 19:24:28.896: W/HttpTransport(11527):     at com.google.api.client.googleapis.media.MediaHttpUploader.upload(MediaHttpUploader.java:293)
11-27 19:24:28.896: W/HttpTransport(11527):     at com.google.api.services.drive.Drive$Files$Insert.executeUnparsed(Drive.java:309)
11-27 19:24:28.896: W/HttpTransport(11527):     at com.google.api.services.drive.Drive$Files$Insert.execute(Drive.java:331)
进度侦听器:

private class FileUploadProgressListener implements MediaHttpUploaderProgressListener {

    private String mFileUploadedName;

    public FileUploadProgressListener(String fileName) {
        mFileUploadedName = fileName;
    }

    @Override
    public void progressChanged(MediaHttpUploader mediaHttpUploader) throws IOException {
        if (mediaHttpUploader == null) return;
        switch (mediaHttpUploader.getUploadState()) {
            case INITIATION_STARTED:
            //System.out.println("Initiation has started!");
                break;
            case INITIATION_COMPLETE:
            //System.out.println("Initiation is complete!");
                break;
            case MEDIA_IN_PROGRESS:
                double percent = mediaHttpUploader.getProgress() * 100;
                if (Ln.DEBUG) {
                    Log.d(Ln.TAG, "Upload to Dropbox: " + mFileUploadedName + " - " + String.valueOf(percent) + "%");
                }
                notif.setProgress(percent, mFileUploadedName).fire();
                break;
            case MEDIA_COMPLETE:
            //System.out.println("Upload is complete!");
        }
    }
}
更多信息请点击此处:

直接媒体上载将在一个请求中上载整个媒体内容,而不是可在多个请求中上载的可恢复媒体上载协议

直接上传可以减少HTTP请求的数量,但是 通过大媒体上传(例如。 连接失败)

由于库的体系结构,您必须在chunk和progress之间进行选择,或者选择一步不进行。 最小的块大小应该可以改善情况。 可能更小的块:

setChunkSize(MediaHttpUploader.MINIMUM_CHUNK_SIZE)

希望有帮助

关于区块大小,它必须是MediaHttpUploader.MINIMUM_chunk_size的倍数,这就是它与您以前的值出错的原因。

CloudRail SDK的方法与原始方法略有不同。以下ProgressInputStream可用于上传和下载进度指示

class ProgressInputStream extends InputStream {

  private InputStream stream;
  private ProgressListener progressListener;
  private long offset = 0;

  public ProgressInputStream(InputStream stream, UploadProgressListener progressListener) {
    this.stream = stream;
    this.progressListener = progressListener;
  }

  @Override
  public int read() throws IOException {
    int res = this.stream.read();
    this.progressListener.onProgressChanged(++this.offset);

    return res;
  }

  @Override
  public int read(byte[] b, int off, int len) throws IOException {
    int res = this.stream.read(b, off, len);
    this.offset += res;
    this.progressListener.onProgressChanged(this.offset);

    return res;
  }

  // You might need to override additional methods but you can just
  // call the corresponding method on the stream property

  public interface ProgressListener {
    void onProgressChanged(long bytes);
  }
}

可以找到完整的教程

如果我将大小设置为2的倍数,例如:10*1024*1024,它现在就可以工作了。之前我收到错误,因为我使用1000000。在Android中找不到此接口
MediaHttpUploaderProgressListener
。感谢您确认我关于非分块上传不支持进度反馈的直觉