2009-12-02 50 views
10

我的应用程序将数据本地存储在本机SQLite数据库中,我希望允许用户通过向自己发送一个.csv文件来导出这些数据。为了做到这一点,我从数据库生成的.csv和其写入到SD卡上,然后将其附加到电子邮件:Android:可以将文件附加到电子邮件而不写入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的步骤并直接附加数据。

+1

我不打算发布这个答案,但不能只是将CSV文件写入内存中的流,然后通过电子邮件意向传递该流? – MattC 2009-12-02 18:39:37

+2

@MATC:不,因为没有“额外”类型是一个流。 – CommonsWare 2009-12-02 18:52:56

+1

+1好问题.. – SRam 2011-07-27 11:11:50

回答

3

即使有可能,我也建议不要。

Intents用于启动活动的时间将会持续相当长的时间 - 只要所讨论的活动是“活着的”并且可以想象返回到(例如回到栈上,因为用户在撰写电子邮件时接了电话,然后通过短信聊天了半个小时)。

而且,Intents在进程之间复制一个合理位作为其中的一部分。例如,电子邮件客户端将处于与您的应用程序不同的过程中。

由于这两个原因,你需要保持你的Intents小。内容的Uri的唯一替代方案是将内容直接放在额外的内容中,并且该CSV文件可能会有点大。

+0

我想要做到这一点,因为它似乎是真的令人沮丧,似乎与用户的pov无关,在没有安装SD的情况下失败。但这是一个很好的建议,我可以与它合作。 – Bee 2009-12-02 20:07:16

+3

您可以尝试将其放入应用程序本地文件存储区(getFilesDir())并使其具有世界可读性。我通常不会混淆访问控制标志,但您需要电子邮件客户端才能读取文件。 SD卡适用于此,但正如您所指出的那样,可以想象没有SD卡。 – CommonsWare 2009-12-03 05:37:18

+0

如果传递给Intent的数据太多,则为TransactionTooLargeException。 – kaay 2017-12-13 10:32:35

相关问题