2012-11-27 6 views
13

Jak sprawdzić postęp przesyłania z wykorzystaniem interfejsu API GoogleDrive?Sprawdzanie postępów w zakresie przesyłania i pobierania (Google Drive API dla Androida lub Java)

The service.files(). Insert (body, mediaContent) .execute(); Zwróć tylko plik plik, który możemy sprawdzić, czy plik został całkowicie załadowany.

Ale czy muszę to sprawdzić w czasie rzeczywistym (przynajmniej co sekundę), czy tak jest?

W przypadku części do pobrania uważam, że możemy ręcznie porównać liczbę odczytanych już bajtów z strumienia wejściowego do całkowitego rozmiaru pliku, a następnie obliczyć obecny postęp.

Ale czy to jest właściwy sposób? Czy istnieje inny lepszy sposób sprawdzania postępu?

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(); 
    } 

edycja: Za pomocą tego kodu 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

jestem w stanie uzyskać pewien postęp jeśli teraz używam możliwego do wznowienia przesyłania, ustawić chunksize do 1MB. ALE są teraz 2 problemy.

1) Przesyłanie do wznowienia jest znacznie wolniejsze niż przesyłanie pojedynczego pliku, ponieważ zatrzymuje się wiele razy pomiędzy, wysyłając tylko 1 MB za każdym razem.
Jeśli ustawię porcję na wyższą, to w ogóle nie wskaże postępu dla mniejszego pliku.
Tak więc postęp w przesyłaniu do wznowienia nie jest tym, czego naprawdę chcę. Chcę postępu w pojedynczym przesyłaniu.

2) Jeśli ustawię rozmiar na około 1 MB, mój upload zawsze będzie miał wartość nieudaną na poziomie około 70% dla normalnego pliku 10 MB.
Jeśli ustawię porcję na 10 MB, odniesie sukces, ale nie zobaczę żadnego postępu.

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 Błąd:

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) 
+0

działa teraz, JEŚLI ustawię rozmiar na wielokrotność 2, na przykład: 10 * 1024 * 1024. Wcześniej dostaję błąd, ponieważ używam 1000000. – tcboy88

Odpowiedz

9

Progress słuchacz:

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

Więcej informacji tutaj: https://code.google.com/p/google-api-java-client/wiki/MediaUpload

Direct media upload will upload the whole media content in one request as opposed to the resumable media upload protocol that could upload in multiple requests.

Doing a direct upload reduces the number of HTTP requests but increases the change of failures with a large media upload (e.g. connection failure).

Ze względu na architekturę w bibliotece musisz wybrać między porcją a postępem LUB jednym krokiem bez postępu. Najmniejszy rozmiar porcji powinien poprawić sytuację. Mniejszy fragment możliwe:

setChunkSize(MediaHttpUploader.MINIMUM_CHUNK_SIZE) 

Nadzieję, że to pomaga!

+0

Nie można znaleźć tego interfejsu 'MediaHttpUploaderProgressListener' w systemie Android. –

+0

Dziękuję za potwierdzenie mojego instynktu dotyczącego niekasowania przesyłania, które nie obsługuje opinii postępu – Ian

2

Co się tyczy wielkości porcji, musi to być wielokrotność MediaHttpUploader.MINIMUM_CHUNK_SIZE, dlatego została ona zerwana z poprzednią wartością.

0

Nieco odmienne podejście z CloudRail SDK zamiast oryginalnego.Następujący ProgressInputStream może być używany do przesyłania postępu postępu pobierania.

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

Pełny samouczek można znaleźć here.

Powiązane problemy