通过电子邮件发送文件 - 无法使用附件 - 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的主要内容,如果未能解决你的问题,请参考以下文章