2016-09-21 1 views
0

Je suis frustré d'essayer d'obtenir des informations sur la progression de mon asynctask lors de l'insertion d'un message via Gmail Api pour Android.Vérifier la progression pour le téléchargement (Google GMail API pour Android)

J'essaye d'utiliser le MediaHttpUploaderProgressListener mais le problème est que je viens juste de sortir de la méthode getMediaHttpUploader() de l'insertion.

Je pense que je manque quelque chose de grand au milieu pour obtenir la réponse attendue de la getMediaHttpUploader ...

Ceci est mon code:

private class TareaGestionEnvioMails extends AsyncTask<Void, Void, Message> { 
    @Override 
    protected Message doInBackground(Void... params) { 
     try { 
      if (mensaje != null) { 
       String user = "me"; 

       Gmail.Users.Messages.Insert insert = servicioGmail.users().messages().insert(user, mensaje); 
       MediaHttpUploader uploader = insert.getMediaHttpUploader(); 
       //getMediaHttpUploader returns me null value :(
       uploader.setDirectUploadEnabled(false); 
       uploader.setChunkSize(1024*256); 
       uploader.setProgressListener(new FileUploadProgressListener()); 

       mensaje = insert.execute(); 
      } 
      return mensaje; 
     } catch (Exception e) { 
      mLastError = e; 
      cancel(true); 
      return null; 
     } 
    } 
... 

    private class FileUploadProgressListener implements MediaHttpUploaderProgressListener { 

    public FileUploadProgressListener() { 
    } 

    @Override 
    public void progressChanged(MediaHttpUploader mediaHttpUploader) throws IOException { 
     if (mediaHttpUploader == null) return; 
     switch (mediaHttpUploader.getUploadState()) { 
      case INITIATION_STARTED: 
       pantallaPrincipal.onProgresoEnviarMail(0.0, "INITIATION_STARTED"); 
       break; 
      case INITIATION_COMPLETE: 
       pantallaPrincipal.onProgresoEnviarMail(0.0, "INITIATION_COMPLETE"); 
       break; 
      case MEDIA_IN_PROGRESS: 
       double percent = mediaHttpUploader.getProgress() * 100; 
       pantallaPrincipal.onProgresoEnviarMail(percent, "MEDIA_IN_PROGRESS"); 
       break; 
      case MEDIA_COMPLETE: 
       pantallaPrincipal.onProgresoEnviarMail(100.0, "MEDIA_COMPLETE"); 
     } 
    } 
} 

Merci à tous! C'est ma première fois sur Stackoverflow!

Répondre

0

Résolu !!!!

Vous devez utiliser la version à trois paramètres de la méthode insert(). J'ai rempli le troisième paramètre avec mon MimeMessage cette façon:

ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
myMimeMessage.writeTo(baos); 
AbstractInputStreamContent mediaContent = new ByteArrayContent("message/rfc822", baos.toByteArray()); 
Gmail.Users.Messages.Insert insert = servicioGmail.users().messages().insert(user, null, mediaContent); 

Il y a deux choses que vous devez être au courant:

1) Si vous continuez à utiliser le « message » et les paramètres "AbstractInputStreamContent" en même temps, vous serez content de petits messages ... Mais si vous devez télécharger un message plus gros qu'environ 1mb, vous obtiendrez une horrible exception de 400 Bad_Request avec une "Demande trop grande " Erreur. Ainsi, laissez le paramètre Message nul.

2) En laissant le paramètre "Message" nul, vous ne pouvez pas définir le Label du message ... vous devrez donc le remplir plus tard en utilisant users(). Messages(). Modifier la méthode.

Si quelqu'un a une meilleure solution pour insérer un gros mail et son label en même temps, et avoir un retour de la progression, s'il vous plaît commenter! Merci!