如果我使用Gmail应用程序作为我的电子邮件客户端,使用下面的代码,我可以毫无问题地将文件附加到我的应用程序的电子邮件中。但是,任何其他电子邮件客户端都会忽略我发送给它的附件。
这是我的代码:
public static void sendEmail(Context context, String toAddress, String subject, String body, String attachmentPath) throws Exception{
try {
Intent intent = new Intent(Intent.ACTION_SENDTO, Uri.fromParts("mailto", toAddress, null));
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putExtra(Intent.EXTRA_SUBJECT, subject);
intent.putExtra(Intent.EXTRA_TEXT, body);
File file = new File(attachmentPath);
Uri uri = Uri.fromFile(file);
intent.putExtra(Intent.EXTRA_STREAM, uri);
context.startActivity(intent);
}
catch(Exception ex) {
ex.printStackTrace();
throw ex;
}
}
是否有人知道如何以任何非Gmail电子邮件客户端识别并接受附件的方式设置Intent?
谢谢。
答案 0 :(得分:3)
这里有一些有用的代码。为什么它应该有所作为,我不知道,但它确实有效。
public static void sendEmail(Context context, String toAddress, String subject, String body, String attachmentPath, String attachmentMimeType) throws Exception{
try {
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putExtra(Intent.EXTRA_EMAIL, new String[]{toAddress});
intent.putExtra(Intent.EXTRA_SUBJECT, subject);
intent.putExtra(Intent.EXTRA_TEXT, body);
File file = new File(attachmentPath);
Uri uri = Uri.fromFile(file);
intent.putExtra(Intent.EXTRA_STREAM, uri);
intent.setType(attachmentMimeType);
context.startActivity(Intent.createChooser(intent, "Choose an email application..."));
}
catch(Exception ex) {
ex.printStackTrace();
throw ex;
}
}
请注意使用ACTION_SEND代替ACTION_SENDTO,以及调用setType(...)。它似乎有效,但它不会过滤出作为发送选项显示的非电子邮件应用列表。对我来说已经足够了 - 除非有人对如何使这项工作有任何想法,并且仍然过滤目标应用程序列表。
感谢那些提出建议的人。希望这也会帮助其他人。
答案 1 :(得分:1)
您是否考虑过特定的电子邮件客户端?他们中的许多人甚至不处理意图中的附件,或者期望意图以不同方式填充。
答案 2 :(得分:1)
通常,只有当应用程序供应商提供有关您可以传入的参数的规范或查看源代码时,才可能这样做。您首先需要找出用于电子邮件客户端的activity
/ intent
,然后在该活动中处理extra
个。{/ p>
如果您很幸运,您可能会找到类似此http://developer.android.com/guide/appendix/g-app-intents.html的列表或者Where is a list of available intents in Android?或该应用的作者帮助您实现正确的意图调用。