检查上传进度(Google GMail API for Android)
Check progress for Upload (Google GMail API for Android)
我在通过 Gmail Api 为 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");
}
}
}
谢谢大家!这是我第一次在 Whosebug 上发帖!
已解决!!!!
您必须使用 insert() 方法的三参数版本。我用我的 MimeMessage 填充了第三个参数:
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);
有两件事你必须知道:
1) 如果您继续同时使用“Message”和“AbstractInputStreamContent”参数,您将对小消息很满意...但是如果你必须上传大于 1mb 左右的消息,你将得到一个可怕的 400 Bad_Request 异常和 "Request too large" 错误。因此,将 Message 参数保留为空。
2) 将 "Message" 参数留空,您无法设置消息的 Label...所以您稍后必须使用 users 来填充它().messages().修改方法。
如果谁有更好的解决方法,可以同时插入大邮件和它的标签,并反馈进度,请评论!谢谢!
我在通过 Gmail Api 为 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");
}
}
}
谢谢大家!这是我第一次在 Whosebug 上发帖!
已解决!!!!
您必须使用 insert() 方法的三参数版本。我用我的 MimeMessage 填充了第三个参数:
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);
有两件事你必须知道:
1) 如果您继续同时使用“Message”和“AbstractInputStreamContent”参数,您将对小消息很满意...但是如果你必须上传大于 1mb 左右的消息,你将得到一个可怕的 400 Bad_Request 异常和 "Request too large" 错误。因此,将 Message 参数保留为空。
2) 将 "Message" 参数留空,您无法设置消息的 Label...所以您稍后必须使用 users 来填充它().messages().修改方法。
如果谁有更好的解决方法,可以同时插入大邮件和它的标签,并反馈进度,请评论!谢谢!