我的问题实际上由两部分组成:
-
context.getCacheDir() 对您的应用程序是私有的。你不能把东西放在那里并期望其他应用能够访问它。
- 我误解了我应该使用的 MIME 类型。尽管我发送的是电子邮件文本,但我确实需要指定
image/png 以作为附件。
此外,研究表明将(可能很大)图像放在主存储器上并不是一个好主意,即使您要立即清理它。
完成这些操作并将生成的图像写入 SD 卡上的公共位置后,它就可以正常工作了。
所以,总而言之:
在清单中请求 SD 卡访问权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
确保 SD 卡可用
if (!Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()))
{
//Bail gracefully
}
在 SD 卡上创建目录
File pngDir = new File(
Environment.getExternalStorageDirectory(),
//Loose convention inferred from app examples
"Android/data/com.somedomain.someapp/flotsam");
if (!pngDir.exists())
pngDir.mkdirs();
将文件写入该目录并捕获 Uri
File pngFile = new File(pngDir, "jetsam.png");
//Save file encoded as PNG
Uri pngUri = Uri.fromFile(pngFile);
构建ACTION_SEND 意图
Intent intent = new Intent(android.content.Intent.ACTION_SEND);
intent.setType("image/png"); //
intent.putExtra(android.content.Intent.EXTRA_EMAIL, new String[] { "someone@somewhere.com" });
intent.putExtra(android.content.Intent.EXTRA_SUBJECT, "Portable Network Graphics");
intent.putExtra(android.content.Intent.EXTRA_CC, new String[] { "carbon@somewhere.com" });
intent.putExtra(Intent.EXTRA_TEXT, "Something textual");
intent.putExtra(Intent.EXTRA_STREAM, pngUri);
然后开始活动
context.startActivity(Intent.createChooser(intent, "Something Pithy"));
然后确保你把所有东西都清理干净......
注意事项 1
似乎对特定于应用的 SD 卡目录提供了更多支持,但遗憾的是,不在我所需的 SDK 版本中。
注意事项 2
这是最终对我有用的解决方案的概述。这不一定是“最佳实践”方法。
注意事项 3
这确实意味着应用程序必须安装 SD 卡才能使用图像附件功能,但这对于我的用例来说是完全可以接受的。你的旅费可能会改变。如果 SD 卡不可用,我会在电子邮件中附加一个友好的说明,解释为什么无法附加图像以及如何纠正这种情况。