检查上传进度(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().修改方法。

如果谁有更好的解决方法,可以同时插入大邮件和它的标签,并反馈进度,请评论!谢谢!