2016-09-21 3 views
0

Android 용 Gmail API를 통해 메일을 삽입하는 동안 내 asynctask의 진행 상황에 대한 정보를 얻으려고 애쓰는 중입니다.업로드 진행 확인 (Android 용 Google GMail API)

MediaHttpUploaderProgressListener를 사용하려고하는데 문제는 삽입의 getMediaHttpUploader() 메소드에서 null이 발생한다는 것입니다.

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

모두 감사합니다 :

나는

이 내 코드는 ... 내가 getMediaHttpUploader 중 예상되는 응답을 얻을 중간에 큰 뭔가를 놓친 것 같아! 이것은 Stackoverflow에 게시 한 첫 번째 시간입니다!

답변

0

해결 된 !!!!

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 예외가 발생합니다 "오류. Message 매개 변수를 null로 두십시오.

2) "Message"매개 변수를 null로두면 메시지의 레이블을 설정할 수 없으므로 나중에 users(). messages()를 사용하여 채워야합니다. 변경 방법.

누군가 큰 메일을 삽입 할 수있는 좋은 방법이 있으며 동시에 라벨을 가지고 있고 진행 상황에 대한 의견이 있으시면 의견을 남기십시오! 감사!