2009-02-25 90 views
67

我试图启动一个意图发送电子邮件。所有这些都有效,但是当我尝试发送电子邮件时,发生了一些“奇怪”的事情。尝试附加一个文件从SD卡到电子邮件

这里是代码

Intent sendIntent = new Intent(Intent.ACTION_SEND); 
sendIntent.setType("image/jpeg"); 
sendIntent.putExtra(Intent.EXTRA_SUBJECT, "Photo"); 
sendIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("file://sdcard/dcim/Camera/filename.jpg")); 
sendIntent.putExtra(Intent.EXTRA_TEXT, "Enjoy the photo"); 
startActivity(Intent.createChooser(sendIntent, "Email:")); 

所以,如果我启动使用的Gmail菜单方面它显示了依恋,让我键入电子邮件是谁,和编辑的身体&主题。没什么大不了。我点击发送,然后发送。唯一的是附件不会被发送。

所以。我想,为什么不尝试使用电子邮件菜单上下文(用于我手机上的备份电子邮件帐户)。它显示了附件,但没有文字在身体或主题。当我发送它时,附件发送正确。那会让我相信有些事情是错误的。我是否需要在Manifest发布新的权限以发送带附件的电子邮件?我究竟做错了什么?

+1

感谢Chrispix的ArrayList附加多个项目!这个代码在我的摩托CLIQ工作。 – Jana 2010-10-19 07:09:44

回答

94

也越来越相同的问题

代码:

Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND); 
    emailIntent.setType("image/jpeg"); 
    emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, new String[] 
    {"[email protected]"}); 
    emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, 
    "Test Subject"); 
    emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, 
    "go on read the emails"); 
    Log.v(getClass().getSimpleName(), "sPhotoUri=" + Uri.parse("file:/"+ sPhotoFileName)); 
    emailIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("file:/"+ sPhotoFileName)); 
    startActivity(Intent.createChooser(emailIntent, "Send mail...")); 

从adb logcat:

V/DumbDumpersMain(3972): sPhotoUri=file://sdcard/DumbDumpers/DumbDumper.jpg 
I/ActivityManager( 56): Starting activity: Intent { action=android.intent.action.CHOOSER comp={android/com.android.internal.app.ChooserActivity} (has extras) } 
I/ActivityManager( 56): Starting activity: Intent { action=android.intent.action.SEND type=jpeg/image flags=0x3000000 comp={com.google.android.gm/com.google.android.gm.ComposeActivityGmail} (has extras) } 
I/ActivityManager( 56): Starting activity: Intent { action=android.intent.action.SEND type=jpeg/image flags=0x2800000 comp={com.google.android.gm/com.google.android.gm.ComposeActivity} (has extras) } 
D/gmail-ls( 120):  MailProvider.query: content://gmail-ls/labels/[email protected](null, null) 
D/Gmail (2507):  URI FOUND:file://sdcard/DumbDumpers/DumbDumper.jpg 

看起来像电子邮件提供商是附属ng长度为0的文件。当我检查文件系统时,文件存在且正确。创建图像文件的代码在尝试发送电子邮件之前已经完成。

任何人修复这个没有魔术重启(我已经试过了)?

问候,

更新

我的路径应该是

file:///sdcard/DumbDumpers/DumbDumper.jpg

你需要额外的/,因为这点到根目录下,即:

file://+/sdcard/DumbDumpers/DumbDumper.jpg

合并为

file:///sdcard/DumbDumpers/DumbDumper.jpg

在上面的代码中,你需要:

emailIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("file://"+ sPhotoFileName)); 

我希望这有助于。我花了很多时间去调试。

问候,
芬利

+6

我upvoted,但它会更好,如果你重新这样做,最终的解决方案是工作到代码。解决方案比这里的故事更重要。 – 2010-01-24 05:47:27

+3

我改变了答案,以反映它需要3个斜线的事实。我也投了这个票。 – Chrispix 2010-11-04 13:04:36

+0

upvote,我不会重写这个,因为人们应该知道错误在哪里。感谢您的解决方案。 – mad 2010-12-13 10:42:08

4

看来,这实际上是正确的,不知道发生了什么事,但重新启动后它开始工作:/

+0

OP的代码有一个错字:路径应该是`file:/// sdcard`(注意三个斜杠,与两个相反)。 – 2011-11-20 20:54:56

7

,而不是 “Uri.parse” 使用“Uri.fromFile(新文件(环境。getExternalStorageDirectory(),“文件名”))”

Environment.getExternalStorageDirectory() - 路径SD卡或其他外部存储

21

只是一点点的话从我的身边,我一直有同样的问题。GMail的,但不知何故,似乎当我第一次有问题的文件存储在SD卡上,并从那里,而不是从资产检索到工作,所以我的代码如下:

Intent i = new Intent(Intent.ACTION_SEND); 
i.putExtra(Intent.EXTRA_SUBJECT, "Title"); 
i.putExtra(Intent.EXTRA_TEXT, "Content"); 
i.putExtra(Intent.EXTRA_STREAM, uri); 
i.setType("text/plain"); 
startActivity(Intent.createChooser(i, "Send mail")); 

这里,

uri = Uri.fromFile(new File(context.getFilesDir(), FILENAME)); 

工作,而

uri = Uri.fromFile(new File(Environment.getExternalStorageDirectory(), FILENAME)); 

一样。

问候, 迈克尔

3

我得到了同样的问题,并四处寻找一个解决方案。最后,我通过找到一个开箱即用的应用程序来解决这个问题,并且看看他们是如何做到的。代码很长,所以我不会在这里引用它,但发布一个链接。看看sendEmail功能线449

http://rehearsalassist.svn.sourceforge.net/viewvc/rehearsalassist/android/trunk/src/urbanstew/RehearsalAssistant/SessionPlayback.java?revision=94&view=markup

我重构我的代码是相似的,而现在它的工作原理。我希望这会帮助其他人在相同的情况下。

3

RFC 1738 3.10节:

的文件URL的形式:

file://<host>/<path> 

其中主机是 系统的完全限定域名,其路径是可访问的,并路径是分层的 目录路径的形式目录/目录/.../名称

所以它是file:/// path/from/root就像http://host/path/from/root因为在第二个和第三个斜杠之间有一个隐式的'localhost'。但如上所述,使用Uri.FromFile()来构建它。

0

我有相同的症状。在我的情况,这是因为我最初保存附件的权限MODE_PRIVATE。只要我将其更改为MODE_WORLD_READABLE,似乎GMail就能够访问该文件并正确发送附件。

See more

4
Intent i = new Intent(Intent.ACTION_SEND); 
    i.setType("message/rfc822"); 
    i.putExtra(Intent.EXTRA_EMAIL , new String[]{"[email protected]"}); 
    i.putExtra(Intent.EXTRA_SUBJECT, "Data from app"); 
    i.putExtra(Intent.EXTRA_TEXT , "experience number x"); 
    i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 

    Uri uri = Uri.fromFile(new File(Environment.getExternalStorageDirectory(), "filename.txt")); 
    i.putExtra(Intent.EXTRA_STREAM, uri); 
    startActivity(Intent.createChooser(i, "Send email...")); 
0
public void sendMail(String path) { 
     Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND); 
     emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, 
     new String[] {AppConstant.server_mail}); 
     emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, 
     "IBPS ERROR Mail"); 
     emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, 
     "This is an autogenerated mail from IBPS app"); 
     emailIntent.setType("image/png"); 
     Uri myUri = Uri.parse("file://" + path); 
     emailIntent.putExtra(Intent.EXTRA_STREAM, myUri); 
     startActivity(Intent.createChooser(emailIntent, "Send mail...")); 
     } 
0

另外尝试添加Intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);这有助于我的问题。

0

我有这个解决方案后4天,请注意以下,同时给予路径文件中的Android(Java)的类分:

1)使用路径内部存储字符串路径=“/存储/ sdcard0/myfile.txt的“;

2)path =“/ storage/sdcard1/myfile.txt”;

3)在Manifest文件中提及权限。

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 

4)首先检查文件长度以确认。

5)检查在ES文件浏览器路径关于sdcard0 & sdcard1被此相同或其他......

例如

File file=new File(path); 
long=file.length();//in Bytes 
0

发送电子邮件带有附件:(通过文档)

意图emailIntent =新意图(Intent.ACTION_SEND); emailIntent.setType(HTTP.PLAIN_TEXT_TYPE);

emailIntent.putExtra(Intent.EXTRA_EMAIL,new String [] {“[email protected]”});

emailIntent.putExtra(Intent.EXTRA_SUBJECT,“Email subject”); emailIntent.putExtra(Intent.EXTRA_TEXT,“电子邮件消息文本”); emailIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse(“content:// path/to/email/attachment”));

//你也可以通过传递尤里斯