Android:如何将临时生成的图像附加到电子邮件? [英] Android: How do I attach a temporary, generated image to an email?

查看:36
本文介绍了Android:如何将临时生成的图像附加到电子邮件?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个以编程方式生成的图像,我想通过 ACTION_SENDEXTRA_STREAM 方法将其作为附件发送.

I have a programmatically generated image that I want to send as an attachment via the ACTION_SEND and EXTRA_STREAM method.

但是我该怎么做呢?

我的第一次尝试(写入我的基于 context.getCacheDir() 的文件路径)似乎在 Gmail 预览中工作(没有图像预览,但附加的文件名和图标是可见的),但是附件从未到达接收方.我想这与生成文件的权限有关,但如何避免这种情况?我是否需要对这些生成的文件设置更多的宽松设置(以便 Gmail 活动可以访问)?应用程序的缓存文件夹甚至可能吗?

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.

我什至尝试过纯粹以 data:image/png;base64,ABCD... 样式 URI 编码我的图像.这也显示在 Gmail 预览中(附件图标,但没有文件名),但没有生成收件人端附件.

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?

推荐答案

我的问题实际上由两部分组成:

My problem really consisted of two parts:

  1. context.getCacheDir() 是您的应用私有的.您不能将某些内容放在那里,并期望其他应用能够访问它.
  2. 我误解了我应该使用的 MIME 类型.尽管我正在发送电子邮件文本,但为了我的附件,我确实需要指定 image/png.
  1. context.getCacheDir() is private to your app. You can't put something there and expect another app to be able to access it.
  2. I misunderstood what MIME type I should have been using. Even though I was sending email text, I really needed to specify 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.

在我完成这些操作并将生成的图像写入 SD 卡上的公共位置后,它运行良好.

Once I did these things and wrote my generated images to a public location on the SD Card, it worked just fine.

所以,总而言之:

在清单中请求 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意图

Build an ACTION_SEND intent

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"));

然后确保你把所有东西都清理干净...

And then make sure you clean everything up...

注意事项 1

对于特定于应用程序的 SD 卡目录似乎有更多支持,但可惜,在我所需的 SDK 版本中没有.

There appears to be more support coming for app-specific SD Card directories, but alas, not in my required SDK version.

注意事项 2

这是最终对我有用的解决方案的概述.这不一定是最佳实践"方法.

This is an overview of the solution that eventually worked for me. It is not necessarily a "best practice" approach.

注意事项 3

这确实意味着应用程序必须安装 SD 卡才能使用图像附件功能,但这对于我的用例来说是完全可以接受的.你的旅费可能会改变.如果 SD 卡不可用,我会在电子邮件中附加一条友好的注释,解释为什么无法附加图像以及如何纠正这种情况.

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.

这篇关于Android:如何将临时生成的图像附加到电子邮件?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆