Android:如何将临时生成的图像附加到电子邮件中?
我有一个以编程方式生成的图像,我想通过 ACTION_SEND
和 EXTRA_STREAM
方法将其作为附件发送。
但我该怎么做呢?
我的第一次尝试(写入基于 context.getCacheDir()
的文件路径)似乎在 Gmail 预览中有效(无图像预览,但附加的文件名和图标可见),但附件从未到达在接收方。我猜这与生成文件的权限有关,但如何避免这种情况呢?我是否需要对这些生成的文件设置更宽松的设置(以便 Gmail 活动可以访问)?应用程序的缓存文件夹是否有可能?
是否有另一个更适合写入我的文件的文件位置?我考虑过下载文件夹,但认为对于只需要在通过电子邮件发送之前存在的东西来说,这将是一个尴尬的位置。
我什至尝试过纯粹使用 data:image/png;base64,ABCD...
样式的 URI 来编码我的图像。这也出现在 Gmail 预览中(附件图标,但没有文件名),但没有产生收件人端附件。
有没有人能够通过任何方式将一次性生成的图像附加到电子邮件意图中?我可能忽略了哪些选择?
I have a programmatically generated image that I want to send as an attachment via the ACTION_SEND
and EXTRA_STREAM
method.
But how do i do this?
My first attempt (writing to my context.getCacheDir()
based file path) appeared to work in the Gmail preview (no image preview, but attached file name and icon was visible), but the attachment never arrived on the recipient side. I guess this has something to do with permissions on the generated file, but how to avoid this? Do I need to set more permissive settings on these generated files (so that the Gmail activity can access)? Is that even possible for the app's cache folder?
Is there another file location that would be more suitable to write my files to? I considered the downloads folder, but think it would be an awkward location for something that only needs to exist until it has been emailed.
I have even tried encoding my image purely in a data:image/png;base64,ABCD...
style URI. This, too, showed up in Gmail preview (attachment icon, but no file name), but did not result in a recipient-side attachment.
Has anyone been able to attach a one-shot generated image to an email intent by any means? What options may I have overlooked?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
我刚刚遇到了完全相同的问题(想在我的情况下附加一个文本文件)。如果您查看 Android 日志,会发现其原因是:
作为解决方法(如 HRJ 提到的),您可以使用 ContentProvider 提供对应用程序内部缓存中的文件的访问权限,以便 Gmail 可以附加它们。我刚刚写了一篇关于如何做到这一点的博客文章。
希望这对您有所帮助:)
I've just run into exactly the same issue (wanting to attach a text file in my case). If you look in the Android log, the reason for it is:
As a workaround (as mentioned by HRJ), you can use a ContentProvider to provide access to files in your application's internal cache so that Gmail can attach them. I've just written up a blog post on how to do it.
Hopefully that's of some help :)
我的问题实际上由两部分组成:
context.getCacheDir()
对于您的应用程序来说是私有的。您不能将某些内容放在那里并期望其他应用程序能够访问它。image/png
。此外,研究表明,将(可能很大的)图像放在主内存上并不是一个好主意,即使您要立即清理它。
当我完成这些操作并将生成的图像写入 SD 卡上的公共位置后,它就工作得很好。
因此,总的来说:
在清单中请求 SD 卡访问
确保 SD 卡可用
在 SD 卡上创建目录
写入将您的文件复制到该目录并捕获 Uri
构建
ACTION_SEND
意图然后启动活动
然后确保清理所有内容up...
警告 1
似乎对应用程序特定的 SD 卡目录有更多支持,但可惜的是,我所需的 SDK 版本中没有。
注意事项 2
这是对最终对我有用的解决方案的概述。这不一定是“最佳实践”方法。
警告 3
这确实意味着应用程序必须安装 SD 卡才能使用图像附件功能,但这对于我的用例来说是完全可以接受的。您的里程可能会有所不同。如果 SD 卡不可用,我会在电子邮件中附上一条友好注释,解释为什么无法附加图像以及如何纠正这种情况。
My problem really consisted of two parts:
context.getCacheDir()
is private to your app. You can't put something there and expect another app to be able to access it.image/png
for the sake of my attachment.Additionally, research indicated that putting (potentially large) images on the primary memory was not a good idea, even if you were going to immediately clean it up.
Once I did these things and wrote my generated images to a public location on the SD Card, it worked just fine.
So, in overview:
Request SD Card Access in your manifest
Make sure SD Card is available
Create a directory on the SD Card
Write your file to that directory and capture the Uri
Build an
ACTION_SEND
intentAnd then start the activity
And then make sure you clean everything up...
Caveat 1
There appears to be more support coming for app-specific SD Card directories, but alas, not in my required SDK version.
Caveat 2
This is an overview of the solution that eventually worked for me. It is not necessarily a "best practice" approach.
Caveat 3
This does mean that the application has to have an SD Card mounted in order to have the image attachments feature available, but this was totally acceptable for my use case. Your mileage may vary. If the SD Card is not available, I append a friendly note to the email explaining why the images could not be attached and how to rectify the situation.