我正在尝试发布Intent来发送电子邮件。所有这一切都有效,但当我尝试实际发送电子邮件时,会发生一些“奇怪”的事情。
这是代码
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发布中获得新的权限才能发送带附件的电子邮件?我做错了什么?
答案 0 :(得分:96)
也遇到同样的问题
代码:
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长度的文件。当我检查文件系统时,文件就在那里并且正确。在尝试通过电子邮件发送之前,创建图像文件的代码已经完成。
有人在没有魔术重启的情况下解决了这个问题(我已经尝试过了)?
的问候,
鳍
<强>更新强>
我的道路应该是
file:///sdcard/DumbDumpers/DumbDumper.jpg
你需要额外的/
因为它指向根目录,即:
file://
+ /sdcard/DumbDumpers/DumbDumper.jpg
合并为
file:///sdcard/DumbDumpers/DumbDumper.jpg
在上面的代码片段中,您需要:
emailIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("file://"+ sPhotoFileName));
我希望这会有所帮助。我花了很长时间来调试。
的问候,
芬雷
答案 1 :(得分: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));
确实
此致 迈克尔
答案 2 :(得分:7)
而不是“Uri.parse”使用“Uri.fromFile(new File(Environment.getExternalStorageDirectory(),”file name“))”
Environment.getExternalStorageDirectory() - SDcard或任何其他外部存储的路径
答案 3 :(得分:4)
看来这实际上是正确的,不确定发生了什么,但重新启动后它开始工作:/
答案 4 :(得分:4)
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..."));
答案 5 :(得分:3)
我遇到了同样的问题,到处寻找解决方案。最后,我通过找到一个开箱即用的开源应用程序来解决它,看看他们是如何做到的。代码相当长,所以我不会在这里引用它,但发布一个链接。查看第449行中的sendEmail函数
我重构了我的代码是相似的,现在它可以工作了。我希望这会在同样的情况下帮助其他人。
答案 6 :(得分:3)
来自RFC 1738第3.10节:
文件网址采用以下格式:
file://<host>/<path>
其中 host 是系统的完全限定域名 路径可以访问,路径是分层的 表单目录/目录/.../ name 。
的目录路径所以它的文件:/// path / from / root就像http://host/path/from/root一样,因为在第二个和第三个斜杠之间有一个隐含的'localhost'。但如上所述,使用Uri.FromFile()来构建它。
答案 7 :(得分:0)
我有同样的症状。在我的情况下,这是因为我最初使用权限MODE_PRIVATE
保存附件。一旦我将其更改为MODE_WORLD_READABLE
,似乎GMail就可以访问该文件并正确发送附件。
答案 8 :(得分:0)
这对我来说很完美: 在这个解决方案中,Nicolas在Cache文件夹中创建了一个副本,这里gmail intent可以访问! http://stephendnicholas.com/archives/974
答案 9 :(得分: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..."));
}
答案 10 :(得分:0)
还尝试添加Intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);这有助于解决我的问题。
答案 11 :(得分:0)
我在4天后得到了解决方案,请注意以下几点,同时给出Android(Java)中File类的路径:
1)使用内部存储路径String path =&#34; /storage/sdcard0/myfile.txt" ;;
2)path =&#34; /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&amp;的路径。 sdcard1也是这样......或者......
e.g。
File file=new File(path);
long=file.length();//in Bytes
答案 12 :(得分:0)
发送附件附件的电子邮件:(按文档提供)
Intent emailIntent = new Intent(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( “内容://路径/到/电子邮件/附件”));
//您还可以通过传递Uris的ArrayList
来附加多个项目