簡體   English   中英

檢查上傳和下載的進度(適用於Android或Java的Google Drive API)

[英]Check progress for Upload & Download (Google Drive API for Android or Java)

如何查看使用GoogleDrive API的上傳進度?

service.files()。insert(body,mediaContent).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();
  }

已編輯:使用此代碼http://code.google.com/p/google-api-java-client/source/browse/drive-cmdline-sample/src/main/java/com/google/api/services/samples /drive/cmdline/DriveSample.java?repo=samples&name=based-on-1.12&r=08555cd2a27be66dc97505e15c60853f47d84b5a

如果我使用可恢復上傳 ,我現在可以取得一些進展,我將chunksize設置為1MB。 但現在有2個問題。

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!");
        }
    }
}

有關詳情,請訪問: https//code.google.com/p/google-api-java-client/wiki/MediaUpload

直接媒體上傳將在一個請求中上傳整個媒體內容而不是可以在多個請求中上傳的可恢復媒體上載協議。

執行直接上載可減少HTTP請求的數量,但會增加大型媒體上載(例如,連接失敗)時的故障更改

由於庫的體系結構,您必須在塊和進度之間進行選擇,或者在沒有進度的情況下選擇一步。 最小的塊大小應該改善事物。 更小的塊可能:

setChunkSize(MediaHttpUploader.MINIMUM_CHUNK_SIZE)

希望能幫助到你!

關於塊大小,它必須是MediaHttpUploader.MINIMUM_CHUNK_SIZE的倍數,這就是為什么它與您之前的值出錯。

使用CloudRail SDK而不是原始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);
  }
}

完整的教程可以在這里找到。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM