Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Comprueba el progreso de la opción Cargar y descargar (API de Google Drive para Android o Java)

¿Cómo comprobar el progreso de una subida que utiliza la API de GoogleDrive?

El archivo service.files (). Insert (body, mediaContent) .execute (); Sólo devolver un archivo que podemos comprobar si el archivo ha cargado completamente.

Pero tengo que comprobar el progreso en tiempo real (al menos cada segundo o así), de todos modos para hacerlo?

Y para la parte de la transferencia directa, pienso que podemos comparar manualmente cuántos bytes hemos leído ya del inputtream al tamaño total del archivo, después calculamos el progreso actual.

¿Pero es esta la manera correcta? O hay otra mejor manera de comprobar el progreso?

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

EDITADO: Utilizando este código 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

Puedo conseguir un cierto progreso ahora si estoy utilizando la carga reanudable , fijé chunksize a 1MB. PERO ahora hay 2 problemas.

1) La carga reanudable es mucho más lenta que la carga única, porque se detiene muchas veces entre, enviando sólo 1 MB cada vez.
Si fijo chunksize a más alto, entonces no mostrará progreso en todos para el archivo más pequeño.
Por lo tanto, el progreso en la carga reanudable no es lo que realmente quiero. Quiero progresar en una sola subida.

2) Si fijo el tamaño de chunksize cerca de 1MB, mi carga falla siempre en el cerca de 70% para un archivo normal de 10MB.
Si establezco chunksize a 10MB entonces será éxito, pero no veré ningún progreso.

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

Error de 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) 

3 Solutions collect form web for “Comprueba el progreso de la opción Cargar y descargar (API de Google Drive para Android o Java)”

Progreso de escucha:

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

Más información aquí: https://code.google.com/p/google-api-java-client/wiki/MediaUpload

La subida directa de medios cargará todo el contenido multimedia en una solicitud en contraposición al protocolo de subida de medios que se puede reanudar y que podría cargarse en varias solicitudes.

Hacer una subida directa reduce el número de solicitudes HTTP pero aumenta el cambio de errores con una carga de medios grande (por ejemplo, fallo de conexión).

Debido a la arquitectura de la biblioteca, usted tiene que elegir entre el trozo y el progreso O un paso sin progreso. El tamaño de trozo más pequeño debe mejorar las cosas. Pieza más pequeña posible:

 setChunkSize(MediaHttpUploader.MINIMUM_CHUNK_SIZE) 

¡Espero eso ayude!

Con respecto al tamaño del trozo, debe ser un múltiplo del MediaHttpUploader.MINIMUM_CHUNK_SIZE que es porqué él errored hacia fuera con su valor anterior.

Un enfoque ligeramente diferente con el SDK de CloudRail en lugar del original. El siguiente ProgressInputStream se puede utilizar para la indicación de progreso de carga y descarga.

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

El tutorial completo se puede encontrar aquí .

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.