【问题标题】:Check progress for Upload (Google GMail API for Android)检查上传进度(适用于 Android 的 Google GMail API)
【发布时间】:2016-09-21 23:41:34
【问题描述】:

在通过 Android 版 Gmail Api 插入邮件时,我试图获取有关我的 asynctask 进度的信息感到很沮丧。

我正在尝试使用 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 上发帖!

【问题讨论】:

    标签: android api gmail listener progress


    【解决方案1】:

    解决了!!!!

    您必须使用 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 异常,并出现“请求太大”错误。因此,将 Message 参数保留为 null。

    2) 将“Message”参数保留为空,您无法设置消息的标签...因此您必须稍后使用 users().messages() 填充它。 修改方法。

    如果有人有更好的解决方法来同时插入大邮件和标签,并且有进度反馈,请发表评论!谢谢!

    【讨论】:

    • 嘿,这对我有帮助。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2014-12-29
    • 2014-01-04
    • 1970-01-01
    • 2017-02-17
    • 2023-03-31
    • 1970-01-01
    • 2013-07-30
    • 2014-10-12
    相关资源
    最近更新 更多