尝试将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菜单上下文启动它显示附件,让我键入谁是电子邮件,并编辑正文和主题。 没什么大不了。 我点击发送,然后发送。 唯一的是附件不会被发送。

所以。 我想,为什么不试试w /电子邮件菜单上下文(为我的电话备份电子邮件帐户)。 它显示的依恋,但在身体或主题没有文字。 当我发送它时,附件发送正确。 那会让我相信有些事情是错的。 我是否需要在Manifest发布新的许可意向发送电子邮件瓦特/附件? 我究竟做错了什么?

也得到同样的问题

码:

 Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND); emailIntent.setType("image/jpeg"); emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, new String[] {"me@gmail.com"}); 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/me@gmail.com(null, null) D/Gmail ( 2507): URI FOUND:file://sdcard/DumbDumpers/DumbDumper.jpg 

看起来像电子邮件提供商正在附加一个0长度的文件。 当我检查文件系统时,文件在那里,正确。 创build图像文件的代码在尝试发送电子邮件之前已经完成。

任何修复这个没有神奇的重启(我已经尝试过)?

问候,

更新

我的path应该是

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

你需要额外/因为这指向根目录,即:

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

合并为

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

在上面的代码片段中,您需要:

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

我希望这有帮助。 我花了很多时间去debugging。

问候,
芬利

只是从我身边的一点点的话。 我一直与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)); 

确实。

问候,迈克尔

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

Environment.getExternalStorageDirectory() – SDcard或任何其他外部存储器的path

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

  Intent i = new Intent(Intent.ACTION_SEND); i.setType("message/rfc822"); i.putExtra(Intent.EXTRA_EMAIL , new String[]{"example@mail.com"}); 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...")); 

我遇到了同样的问题,到处寻找解决办法。 最后,我通过find一个开箱即用的应用程序来解决这个问题,并观察他们是如何做到的。 代码是相当长的,所以我不会在这里引用它,但发布链接。 看看449行的sendEmail函数

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

我重构我的代码是类似的,现在它的工作。 我希望这会在相同的情况下帮助别人。

从RFC 1738第3.10节开始:

一个文件的URL格式如下:

  file://<host>/<path> 

其中host是可访问path的系统的完全限定域名, path是表单目录/ directory /…/ name的分层目录path。

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

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

查看更多

这对我来说是完美的:在这个解决scheme中,Nicolas在Cache文件夹中创build一个副本,这里的gmail意图访问! http://stephendnicholas.com/archives/974

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

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

我已经在4天后得到了解决办法,请注意以下几点,在Android(Java)中给出File类的path:

1)使用内部存储pathString path =“/ storage / 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文件资源pipe理器中有关sdcard0和sdcard1的path是否相同,否则……

例如

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

发送电子邮件附件:(按文档)

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

emailIntent.putExtra(Intent.EXTRA_EMAIL,new String [] {“jon@example.com”});

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

//你也可以通过传递Uris的ArrayList来附加多个项目