检查上传的进度(Google GMail API for Android)

问题描述:

当我通过Gmail Api for Android插入邮件时,试图获取有关我的asyncTask进度的信息时,我感到沮丧。检查上传的进度(Google GMail API for Android)

我正在尝试使用MediaHttpUploaderProgressListener,但问题是我只是从插入的getMediaHttpUploader()方法中取出null。

我觉得我失去了一些东西中间大走出getMediaHttpUploader的预期反应...

这是我的代码:

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

谢谢大家!这是我第一次发布在Stackoverflow上!

解决!!!!

您必须使用insert()方法的三个参数版本。

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

有两件事情你必须要知道的:我已经这样充满第三个参数与我的MimeMessage

1)如果继续使用“消息”和“AbstractInputStreamContent”这两个参数同时出现,你会对小信息感到满意......但是如果你不得不上传大于1mb左右的消息,你会得到一个可怕的400 Bad_Request异常,其中“Request too large “错误。所以,保留Message参数为空。 2)将“消息”参数留空,您不能设置消息的标签 ...所以您将不得不稍后使用users()。messages()来填充消息。 修改方法。

如果任何人有一个更好的解决方法来同时插入一个大邮件和它的标签,并有进展的反馈,请评论!谢谢!