通过电子邮件发送文件 - 无法使用附件 - Android

Posted

技术标签:

【中文标题】通过电子邮件发送文件 - 无法使用附件 - Android【英文标题】:Sending a file via email - cannot get attachment to work - Android 【发布时间】:2019-10-12 00:09:52 【问题描述】:

我有一个在下载文件夹中创建文件的应用程序

这很好用 - 它使用它来获取文件路径:

File path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);

现在我正在尝试将该文件附加到电子邮件中,并且我想我已经接近了,但是我从 Gmail 中收到一个错误,它无法附加该文件。

我从file:// 更改为content://,因为在此之前我无法克服另一个错误。

try 
    final Intent emailIntent = new Intent(Intent.ACTION_SEND);
    emailIntent.setType("plain/text");
    emailIntent.putExtra(Intent.EXTRA_SUBJECT, getString(R.string.email_subject));
    URI = Uri.parse("content://" + exportFilePath);
    emailIntent.putExtra(Intent.EXTRA_STREAM, URI);
    emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, getString(R.string.email_body));
    emailIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
    emailIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
    this.startActivity(Intent.createChooser(emailIntent, getString(R.string.action_export)));

catch (Throwable t) 
    Toast.makeText(this, "failed: " + t.toString(), Toast.LENGTH_LONG).show();
    Log.e("URI: ", URI.toString());

"exportFilePath" 包含文件创建时的完整路径。 它看起来像这样: /storage/emulated/0/Download/file.csv

【问题讨论】:

【参考方案1】:
Uri.parse("content://" + exportFilePath);

这不是您获得content Uri 的方式。 Use FileProvider 提供Downloads 目录的内容,然后使用FileProvider.getUriForFile() 获取该文件的content Uri。使用FileProvider 的相当详细的说明可以在its JavaDocs 中找到。

【讨论】:

好的 - 这是有道理的 - 但是当我必须将文件夹硬编码到 XML 中时,我应该如何确保它是正确的?我必须将路径放入 XML 文件中,但是在 Java 中,当我创建文件时,我使用获取外部存储公共目录并传递下载。有没有更简单的方法来做到这一点并保持文件公开? @EdKuhner:“但是,当我必须将文件夹硬编码到 XML 中时,我应该如何确保它是正确的?” -- 使用<external-path name="whatever" />,你可以用任何你想要的替换whatever。现在您的FileProvider 将能够提供来自所有外部存储的文件。 “有更简单的方法来做到这一点并保持文件公开吗?” - 你真正的问题是“我有一个在下载文件夹中创建文件的应用程序”。这将变得越来越困难,尤其是对于 Android Q/R。使用存储访问框架(在您的情况下为ACTION_CREATE_DOCUMENT)。 @EdKuhner:使用ACTION_CREATE_DOCUMENT,您获得一个Uri,您可以使用它来保存您的内容(通过openOutputStream()ContentResolver)和为您的ACTION_SEND 操作。另外,用户可以选择文件的位置,因为用户可能不希望它在下载目录中。

以上是关于通过电子邮件发送文件 - 无法使用附件 - Android的主要内容,如果未能解决你的问题,请参考以下文章

通过邮件发送超大附件的3种方法介绍

PHP不发送带有附件的邮件

无法使用烧瓶邮件python将附件添加到邮件

无法在多封电子邮件中重复使用电子邮件附件

无法使用意图 (Gmail) 从我的应用程序发送带有附件的电子邮件

如何使用 Python 发送 .docx 附件