我正在尝试从我的应用程序发送文件附件电子邮件。
getCacheDir()
保存到外部存储(SDCard)中的文件可以成功附加,但无法附加保存到我可以获取方法的临时目录中的相同文件。
唯一的区别是我要附加的文件的保存位置,这是因为 Android 规范或限制,还是我遗漏了什么?
我正在使用ACTION_SEND
意图通过电子邮件发送附件文件
//// getting file path to save
//[fail] -- no attatchment in email
//path = new StorageUtil().getCacheFilePath(this, "attatchment.html");
//[success] -- attatchment.html is on email
path = new StorageUtil().getExternalAppStoragePath(this, "attatchment.html");
/// start intent if file saving is successful
if (this.export(path)==true) {
Intent i = new Intent();
i.setAction(Intent.ACTION_SEND);
i.setType("text/html");
i.putExtra(Intent.EXTRA_SUBJECT, "a subject");
i.putExtra(Intent.EXTRA_TEXT, "");
File f = new File(path);
i.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(f));
startActivity(Intent.createChooser(i, "Send Email"));
}
getCacheFilePath() 从以下代码创建路径,其中 fileName 是方法的第二个参数:
File cacheDir = ctx.getCacheDir();
File cacheFile = new File(cacheDir, fileName);
return cacheFile.getPath(); //path
每条路径如下
//cache dir (attachcment failed):
/data/data/{PACKAGE_NAME}/cache/attachment.html
//external dir (attachment successed):
/mnt/sdcard/Android/data/{PACKAGE_NAME}/files/attachment.html
来自缓存目录的文件对象canRead()
,可以获取文件长度。谢谢!
== 已解决 ==
我发现发送Gmail时Logcat上出现如下错误:
file:// attachment paths must point to file:///mnt/sdcard. Ignoring attachment file:///data/data/{PACKAGE_NAME}/cache/attachment.html"
所以这应该是Android的限制。添加Intent.FLAG_GRANT_READ_URI_PERMISSION
没有效果和其他 Activity 像 Dropbox 结果类似。