Java 通过电子邮件发送文件-无法获取工作附件-Android

Java 通过电子邮件发送文件-无法获取工作附件-Android,java,android,email,android-intent,Java,Android,Email,Android Intent,我有一个在下载文件夹中创建文件的应用程序 这可以很好地工作-它使用它来获取文件路径: File path=Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY\u下载) 现在我正试图将该文件附加到电子邮件中,我想我很接近了,但是我从Gmail得到一个错误,它无法附加该文件 我从文件://更改为内容://,因为在此之前我无法通过另一个错误 try { final Intent emailIntent = ne

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

这可以很好地工作-它使用它来获取文件路径:

File path=Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY\u下载)

现在我正试图将该文件附加到电子邮件中,我想我很接近了,但是我从Gmail得到一个错误,它无法附加该文件

我从
文件://
更改为
内容://
,因为在此之前我无法通过另一个错误

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

Uri.parse("content://" + exportFilePath);

这不是获取
内容的方式。要提供
下载
目录的内容,请使用
文件提供程序.getUriForFile()
获取该文件的
内容
Uri
。有关使用
FileProvider
的详细说明,请参见。

好-这很有意义-但是,当我必须将文件夹硬编码到XML中时,如何确保文件夹正确?我必须将路径放入XML文件中,但是在Java中,当我创建文件时,我使用get external storage公用目录并传递下载。有什么更简单的方法可以做到这一点并保持文件的公共性吗?@EdKuhner:“但是,当我必须将文件夹硬编码到XML中时,如何确保文件夹是正确的?”——使用
,您可以将
任何内容替换为您想要的任何内容。现在,您的
FileProvider
将能够提供来自所有外部存储的文件。“有没有更简单的方法来做到这一点,并保持文件的公开?”——你真正的问题是“我有一个应用程序,可以在下载文件夹中创建一个文件”。这将变得越来越困难,尤其是Android Q/R。使用存储访问框架(
ACTION\u CREATE\u DOCUMENT
)@EdKuhner:使用
ACTION\u CREATE\u DOCUMENT
,您将获得一个
Uri
,您可以使用它来保存内容(通过
openOutputStream()
内容解析器上,并为您的
操作发送
操作。此外,用户还可以选择文件的存放位置,因为用户可能不希望文件位于下载目录中。