Gmail“无法附加空文件”

Posted

技术标签:

【中文标题】Gmail“无法附加空文件”【英文标题】:Gmail "Can't attach empty file" 【发布时间】:2015-09-12 18:39:48 【问题描述】:

我的应用程序使用 iText 库(带有已填写表格的模板 PDF)创建了一个 PDF,然后我想将其附加到要发送的电子邮件中。当我尝试附加文件时,我在 Gmail 应用程序中收到错误 Can't attach empty file。还尝试使用 HTC 电子邮件应用程序和 Touchdown 电子邮件应用程序 - 两者都没有附加任何内容并且没有给出错误。

创建 PDF:

public void manipulatePdf(String src, String dest) throws IOException, DocumentException 
        PdfReader reader = new PdfReader(src);
        PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));
        AcroFields form = stamper.getAcroFields();

// Fill all PDF forms here (theres quite a few)

        stamper.setFormFlattening(true);
        stamper.close();
        reader.close();

正在尝试附加文件并发送电子邮件:

public void sendMail()
    Intent emailIntent = new Intent(Intent.ACTION_SEND);
    emailIntent .setType("*/*");
    emailIntent .putExtra(Intent.EXTRA_EMAIL, "blah@gmail.com");
    emailIntent .putExtra(Intent.EXTRA_STREAM, Uri.parse(dest));
    emailIntent .putExtra(Intent.EXTRA_SUBJECT, "Subject");
    startActivity(Intent.createChooser(emailIntent, "Send email..."));

其中dest 是相关文件的路径和文件名。我知道dest 中的路径和文件名没问题,因为这是用于保存文件的 var(我可以在设备和 PC 上查看)。

Gmail 日志:

06-26 00:24:48.901  14476-14476/? E/Gmail﹕ Error adding attachment
    com.android.mail.utils.b: Cannot attach empty attachment
            at com.android.mail.ui.ComposeAttachmentTileGrid.a(SourceFile:62)
            at com.android.mail.compose.c.b(SourceFile:1933)
            at com.android.mail.compose.c.c(SourceFile:2063)
            at com.android.mail.compose.c.a(SourceFile:7992)
            at com.android.mail.compose.c.q(SourceFile:759)
            at com.android.mail.compose.c.onCreate(SourceFile:4830)
            at com.google.android.gm.ComposeActivityGmail.onCreate(SourceFile:194)
            at android.app.Activity.performCreate(Activity.java:5958)
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1129)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2364)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2474)
            at android.app.ActivityThread.access$800(ActivityThread.java:144)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1359)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:155)
            at android.app.ActivityThread.main(ActivityThread.java:5696)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1028)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:823)

【问题讨论】:

“我知道 dest 中的路径和文件名都可以,因为这是用于保存文件的 var”——这并不一定意味着它是可以解析的有效 Uri 值.使用File 对象而不是字符串来表示文件路径。然后,您可以使用Uri.fromFile() 并更好地确保获得有效的Uri 值。您可能希望检查Uri.parse() 结果是什么,看看它是否合理(例如,有一个file 方案)。另外,请坚持FileOutputStream,如果iText 允许,请在close() 之前拨打getFD().sync() 您是否检查了库是否实际上正在为给定的dest 创建文件?尝试读取文件,看看是否有问题。 @osayilgan "我知道 dest 中的路径和文件名没问题,因为这是用于保存文件的 var(我可以在设备和 PC 上查看)" 那么显然是 Uri 问题。试试 CommonsWare 的建议。并记录更多数据,例如您使用Uri.parse(dest) 会得到什么 谢谢 - Uri.parse() 没有有效的 File 方案。现在工作 【参考方案1】:

我遇到了类似的问题。 CommonsWare 上面的评论解决了它。!

使用 Uri.fromFile() 方法创建一个 File 对象并生成一个 Uri。

File file = new File(filePath);
Uri uri = Uri.fromFile(file);

【讨论】:

我的代码中有完全相同的东西,但它并没有解决问题。 好的,我解决了。如果文件在外部目录中,您的解决方案将起作用。如果它位于只有应用程序可以访问的私有目录中,Gmail 将抛出 can't attach empty file。 Uri.parse(imagePath) 不工作,但上述解决方案工作正常。非常感谢。【参考方案2】:

我在装有 Android 6 的 Nexus 5 上遇到了同样的问题(相同的代码在装有 Android 6 的 Nexus 6 上工作),在这里找到了解释和工作解决方案:https://***.com/a/32982050/534898

【讨论】:

以上是关于Gmail“无法附加空文件”的主要内容,如果未能解决你的问题,请参考以下文章

使用 PHP 发送 zip 文件时出现空消息

Ninja Framework mailProvider.get() 给出空指针异常

如何让 perl 与 gmail 聊天一起工作?

检索从 gmail 下载的文件表单附件中的内容,因为它存储在 gmail 服务器中

Mongodb 查找与聚合匹配返回一个空数组

无需下载即可获取 Gmail 附件文件名