Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 安卓:如何将临时生成的图像附加到电子邮件?_Android_Image_Email_Attachment_Dynamically Generated - Fatal编程技术网

Android 安卓:如何将临时生成的图像附加到电子邮件?

Android 安卓:如何将临时生成的图像附加到电子邮件?,android,image,email,attachment,dynamically-generated,Android,Image,Email,Attachment,Dynamically Generated,我有一个通过编程生成的图像,我想通过ACTION\u send和EXTRA\u STREAM方法将其作为附件发送 但是我该怎么做呢 我的第一次尝试(写入我的context.getCacheDir()文件路径)似乎在Gmail预览中起作用(没有图像预览,但附件的文件名和图标可见),但附件从未到达收件人端。我想这与生成文件的权限有关,但是如何避免呢?我是否需要对这些生成的文件设置更多的权限设置(以便Gmail活动可以访问)?对于应用程序的缓存文件夹,这可能吗 是否有其他更适合将文件写入的文件位置?我

我有一个通过编程生成的图像,我想通过
ACTION\u send
EXTRA\u STREAM
方法将其作为附件发送

但是我该怎么做呢

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

是否有其他更适合将文件写入的文件位置?我考虑过下载文件夹,但认为它是一个尴尬的位置,因为它只需要存在,直到它被电子邮件发送

我甚至尝试过用
data:image/png对我的图像进行编码;base64,ABCD…
样式URI。这也出现在Gmail预览中(附件图标,但没有文件名),但不会产生收件人端附件


是否有人能够通过任何方式将一次性生成的图像附加到电子邮件意图?我可能忽略了哪些选项?

我的问题实际上包括两部分:

  • context.getCacheDir()
    是您的应用程序专用的。你不能把东西放在那里,然后指望其他应用程序能够访问它
  • 我误解了我应该使用的MIME类型。尽管我在发送电子邮件文本,但为了我的附件,我确实需要指定
    image/png
  • 此外,研究表明,将(可能较大的)图像放在主内存中不是一个好主意,即使您要立即清理它

    一旦我做了这些事情,并将生成的图像写到SD卡上的公共位置,它就工作得很好

    因此,总而言之:

    在您的清单中请求SD卡访问权

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    
    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);
    
    在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);
    
    建立一个
    动作\u发送
    意图

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    
    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卡不可用,我会在电子邮件中附加一条友好的说明,解释为什么无法附加图像以及如何纠正这种情况。

    我刚刚遇到了完全相同的问题(在我的情况下,希望附加一个文本文件)。如果您查看Android日志,其原因是:

    02-28 21:01:28.434: E/Gmail(19673): file:// attachment paths must point to file:///mnt/sdcard. Ignoring attachment file:///data/data/com.stephendnicholas.gmailattach/cache/Test.txt
    
    作为一种解决方法(正如HRJ所提到的),您可以使用ContentProvider提供对应用程序内部缓存中文件的访问,以便Gmail可以附加这些文件。我刚刚写了一篇关于如何做的文章


    希望这会有所帮助:)

    这可以通过自定义
    内容提供者来完成吗。它不需要额外的权限,也可以删除对SD卡的依赖。@HRJ你能详细说明一下这种可能性吗?我很想看到更多关于如何做到这一点的细节…这个解决方案不适合我。最奇怪的是,图像文件是在sd卡上创建的@Paschalis您的目标android版本是什么?我已经有一段时间没有使用这个解决方案了……目标是4.1@devfuel。min sdk 2.0、max 4.1、target 4.1 ContentProvider是我使用的解决方案。我不希望每个人都能从SD卡上读取我的文件。