Android 安卓:可以将文件附加到电子邮件而不写入SD吗?

Android 安卓:可以将文件附加到电子邮件而不写入SD吗?,android,email,uri,Android,Email,Uri,我的应用程序将数据存储在本地SQLite数据库中,我希望允许用户通过电子邮件将这些数据导出为.csv文件。为此,我从数据库生成.csv并将其写入SD卡,然后将其附加到电子邮件: StringBuilder csv = generateFile(); writeFile(csv.toString(),"file.csv"); Intent email = new Intent(android.content.Intent.ACTION_SEND); email.setType("applicati

我的应用程序将数据存储在本地SQLite数据库中,我希望允许用户通过电子邮件将这些数据导出为.csv文件。为此,我从数据库生成.csv并将其写入SD卡,然后将其附加到电子邮件:

StringBuilder csv = generateFile();
writeFile(csv.toString(),"file.csv");
Intent email = new Intent(android.content.Intent.ACTION_SEND);
email.setType("application/octet-stream");
email.putExtra(android.content.Intent.EXTRA_STREAM, Uri.parse("file://sdcard/file.csv"));

这一切都很好。不过,我想知道的是,是否可以跳过先写入SD的步骤,直接附加数据。

即使可能,我建议不要这样做

用于启动活动的意图将被保留(可能)相当长的一段时间——只要所讨论的活动是“活动”的,并且可以想象可以返回(例如,返回堆栈,因为用户在编写电子邮件时接听了一个电话,然后通过短信聊天半小时)

此外,
意图
在进程之间得到相当多的复制,这是其中的一部分。例如,电子邮件客户端将处于与您的应用程序不同的进程中


出于这两个原因,您需要将
意图保持在较小的范围内。除了内容的
Uri
之外,唯一的替代方法是将内容直接放入额外的内容中……而CSV文件可能会变得有点大。

我不想将此作为一个答案发布,但你不能将CSV文件写入内存中的流,然后在电子邮件中传递该流吗?@MattC:no,因为没有“额外”类型的流。我想实现这一点,因为在没有安装SD的情况下,失败似乎真的令人沮丧,并且似乎与用户的pov无关。但这是一个很好的建议,我可以使用它。你可以尝试将它放在你的应用程序本地文件存储区(getFilesDir())中,让它成为全世界可读的。我通常不会弄乱访问控制标志,但您需要电子邮件客户端才能读取文件。SD卡可以做到这一点,但正如您所指出的,可以想象没有SD卡。仅供参考:TransactionTooLargeException如果向Intent传递了太多数据。