【问题标题】:Android: possible to attach a file to email without writing to SD?Android:可以在不写入 SD 的情况下将文件附加到电子邮件吗?
【发布时间】:2010-12-22 12:25:00
【问题描述】:

我的应用程序将数据本地存储在本机 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 的步骤,直接附加数据。

【问题讨论】:

  • 我不会将此作为答案发布,但您不能将 CSV 文件写入内存中的流,然后在电子邮件意图中传递该流吗?
  • @MattC:不,因为没有“额外”类型是流。

标签: android email uri


【解决方案1】:

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

Intents 用于启动活动将被保留(可能)相当长的时间——只要有问题的活动是“活动的”并且可以想象返回到(例如,回到堆栈上,因为用户在写邮件的时候接了个电话,然后通过短信聊了半个小时)。

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

出于这两个原因,您需要将Intents 保持小。对内容使用Uri 的唯一替代方法是将内容直接放在额外内容中……而且该 CSV 文件可能会变得有点大。

【讨论】:

  • 我想完成这个,因为在没有安装 SD 的情况下,失败似乎真的很令人沮丧,而且似乎与用户的 pov 无关。但这是一个合理的建议,我可以接受。
  • 您可以尝试将其放入您的应用程序本地文件存储区域 (getFilesDir()) 并使其对世界可读。我通常不会弄乱访问控制标志,但是您需要电子邮件客户端才能读取文件。 SD 卡适用于此,但正如您所指出的,可以想象没有 SD 卡。
  • 仅供参考:如果传递给 Intent 的数据过多,则会出现 TransactionTooLargeException。
猜你喜欢
  • 2010-10-09
  • 2014-03-04
  • 1970-01-01
  • 1970-01-01
  • 2014-08-25
  • 2011-10-27
  • 2016-12-03
  • 2021-06-27
  • 2014-06-25
相关资源
最近更新 更多