我的问题实际上包括两部分:
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 卡不可用,我会在电子邮件中附加一个友好的注释,解释为什么无法附加图像以及如何纠正这种情况。