Android 如何通过意图打开电子邮件程序(但仅限于电子邮件程序)
我想设置我的应用程序的一部分,允许用户向其他用户发送快速电子邮件。设置这个并不难:Android 如何通过意图打开电子邮件程序(但仅限于电子邮件程序),android,Android,我想设置我的应用程序的一部分,允许用户向其他用户发送快速电子邮件。设置这个并不难: Intent intent = new Intent(Intent.ACTION_SEND); intent.setType("text/plain"); intent.putExtra(Intent.EXTRA_SUBJECT, subject); intent.putExtra(Intent.EXTRA_TEXT, message); Intent mailer = Intent.createChooser(
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_SUBJECT, subject);
intent.putExtra(Intent.EXTRA_TEXT, message);
Intent mailer = Intent.createChooser(intent, null);
startActivity(mailer);
然而,问题在于,发送的动作不仅仅被电子邮件程序所接受——例如,在我的手机上,Facebook应用程序、Twitter、reddit很有趣,甚至蓝牙都是发送此消息的可行替代方案。对于其中一些人(尤其是Twitter)来说,消息太长了
有没有办法将选择器限制为仅支持长消息(如电子邮件)的应用程序?或者有没有办法检测用户选择的应用程序并适当调整消息?您是否尝试过包含
意图。额外的电子邮件
Intent mailer = new Intent(Intent.ACTION_SEND);
mailer.setType("text/plain");
mailer.putExtra(Intent.EXTRA_EMAIL, new String[]{"name@email.com"});
mailer.putExtra(Intent.EXTRA_SUBJECT, subject);
mailer.putExtra(Intent.EXTRA_TEXT, bodyText);
startActivity(Intent.createChooser(mailer, "Send email..."));
这可能会限制可用接收器应用程序的列表…由于奔腾10建议搜索Linkify的工作方式,我找到了一个很好的解决方案。基本上,您只需创建一个“mailto:”链接,然后调用相应的意图即可
Intent intent = new Intent(Intent.ACTION_VIEW);
Uri data = Uri.parse("mailto:?subject=" + subject + "&body=" + body);
intent.setData(data);
startActivity(intent);
此解决方案有几个有趣的方面:
我使用ACTION\u VIEW操作是因为它更适合“mailto:”链接。您可以不提供任何特定操作,但可能会得到一些不满意的结果(例如,它会询问您是否要将链接添加到联系人)
由于这是一个“共享”链接,我只是不包括电子邮件地址-即使这是一个mailto链接。它起作用了
没有选择者。这样做的原因是让用户利用默认值;如果他们设置了一个默认的电子邮件程序,那么它将直接引导他们,完全绕过选择器(在我看来这很好,你可能会反驳)
当然,我遗漏了很多技巧(例如对主题/正文进行正确编码),但您应该能够自己找到答案。尝试将MIME类型从普通改为消息
intent.setType("text/message");
改变MIME类型就是答案,这就是我在应用程序中改变相同行为的方法。我使用了intent.setType(“message/rfc822”)代码>这有点打字错误,因为您需要切换mimetype:
intent.setType("plain/text"); //Instead of "text/plain"
这对我有用
Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND);
emailIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
emailIntent.setType("vnd.android.cursor.item/email");
emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, new String[] {"abc@xyz.com"});
emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, "My Email Subject");
emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, "My email content");
startActivity(Intent.createChooser(emailIntent, "Send mail using..."));
尝试此选项:
Intent intentEmail = new Intent(Intent.ACTION_SEND);
intentEmail.setType("message/rfc822");
仅发送给电子邮件客户端-带有多个附件
有很多解决方案,但都部分有效
mailto正确过滤电子邮件应用程序,但无法不发送流/文件
消息/rfc822打开了地狱般的应用程序和电子邮件客户端
所以,解决这个问题的办法是两者兼用
首先使用mailto intent解决intent活动
然后将数据设置为每个已解析的活动,以发送所需的数据
构建所需的数据意图,该意图包含要共享的所需数据
private Intent getDataIntent()
{
Intent dataIntent = buildIntent(Intent.ACTION_SEND, null, "message/rfc822", null);
// Set subject
dataIntent.putExtra(Intent.EXTRA_SUBJECT, title);
//Set receipient list.
dataIntent.putExtra(Intent.EXTRA_EMAIL, toRecipients);
dataIntent.putExtra(Intent.EXTRA_CC, ccRecipients);
dataIntent.putExtra(Intent.EXTRA_BCC, bccRecipients);
if (hasAttachments())
{
ArrayList<Uri> uris = getAttachmentUriList();
if (uris.size() > 1)
{
intent.setAction(Intent.ACTION_SEND_MULTIPLE);
dataIntent.putExtra(Intent.EXTRA_STREAM, uris);
}
else
{
dataIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris.get(0));
}
}
return dataIntent;
}
protected ArrayList<Uri> getAttachmentUriList()
{
ArrayList<Uri> uris = new ArrayList();
for (AttachmentInfo eachAttachment : attachments)
{
uris.add(eachAttachment.uri);
}
return uris;
}
private Intent getDataIntent()
{
Intent dataIntent=buildIntent(Intent.ACTION_SEND,null,“message/rfc822”,null);
//设定主题
dataIntent.putExtra(Intent.EXTRA_主题、标题);
//设置接收列表。
dataIntent.putExtra(Intent.EXTRA_电子邮件,收件人);
dataIntent.putExtra(Intent.EXTRA_CC,ccRecipients);
dataIntent.putExtra(Intent.EXTRA_BCC,BCC客户);
如果(hasAttachments())
{
ArrayList URI=getAttachmentUriList();
如果(uris.size()>1)
{
intent.setAction(intent.ACTION\u SEND\u MULTIPLE);
dataIntent.putExtra(Intent.EXTRA_流,URI);
}
其他的
{
dataIntent.putParcelableArrayListExtra(Intent.EXTRA_流,uris.get(0));
}
}
返回数据意图;
}
受保护的ArrayList getAttachmentUriList()
{
ArrayList URI=新的ArrayList();
用于(每个附件的附件信息附件:附件)
{
add(eachAttachment.uri);
}
返回URI;
}
用于根据查询意图筛选所需意图的实用性类
// Placed in IntentUtil.java
public static Intent getSelectiveIntentChooser(Context context, Intent queryIntent, Intent dataIntent)
{
List<ResolveInfo> appList = context.getPackageManager().queryIntentActivities(queryIntent, PackageManager.MATCH_DEFAULT_ONLY);
Intent finalIntent = null;
if (!appList.isEmpty())
{
List<android.content.Intent> targetedIntents = new ArrayList<android.content.Intent>();
for (ResolveInfo resolveInfo : appList)
{
String packageName = resolveInfo.activityInfo != null ? resolveInfo.activityInfo.packageName : null;
Intent allowedIntent = new Intent(dataIntent);
allowedIntent.setComponent(new ComponentName(packageName, resolveInfo.activityInfo.name));
allowedIntent.setPackage(packageName);
targetedIntents.add(allowedIntent);
}
if (!targetedIntents.isEmpty())
{
//Share Intent
Intent startIntent = targetedIntents.remove(0);
Intent chooserIntent = android.content.Intent.createChooser(startIntent, "");
chooserIntent.putExtra(android.content.Intent.EXTRA_INITIAL_INTENTS, targetedIntents.toArray(new Parcelable[]{}));
chooserIntent.addFlags(android.content.Intent.FLAG_GRANT_READ_URI_PERMISSION);
finalIntent = chooserIntent;
}
}
if (finalIntent == null) //As a fallback, we are using the sent data intent
{
finalIntent = dataIntent;
}
return finalIntent;
}
//放在IntentUtil.java中
公共静态意图GetSelectionIntentChooser(上下文上下文、意图查询内容、意图数据意图)
{
List appList=context.getPackageManager().queryIntentActivities(仅限queryIntent、PackageManager.MATCH_DEFAULT_);
意图finalIntent=null;
如果(!appList.isEmpty())
{
List targetedIntents=new ArrayList();
for(ResolveInfo ResolveInfo:appList)
{
字符串packageName=resolveInfo.activityInfo!=null?resolveInfo.activityInfo.packageName:null;
意向允许意向=新意向(dataIntent);
allowedIntent.setComponent(新组件名(packageName,resolveInfo.activityInfo.name));
allowedIntent.setPackage(packageName);
targetedIntents.add(allowedIntent);
}
如果(!targetedIntents.isEmpty())
{
//共同意向
Intent startinent=targetedIntents.remove(0);
Intent-chooserint=android.content.Intent.createChooser(startinent,“”);
选择content.putExtra(android.content.Intent.EXTRA_INITIAL_INTENTS,targetedIntents.toArray(新包裹[]{}));
选择content.addFlags(android.content.Intent.FLAG\u GRANT\u READ\u URI\u PERMISSION);
finalIntent=选择内容;
}
}
如果(finalIntent==null)//作为回退,我们将使用发送的数据意图
{
finalIntent=数据意图;
}
返还资金;
}
试试这个
Intent intent = new Intent("android.intent.action.SENDTO", Uri.fromParts("mailto", "yourmail@gmail.com", null));
intent.putExtra("android.intent.extra.SUBJECT", "Enter Subject Here");
startActivity(Intent.createChooser(intent, "Select an email client"));
没有一个解决方案对我有效。感谢开源开发人员分享他/她的简洁简洁的解决方案
String mailto = "mailto:bob@example.org" +
"?cc=" + "alice@example.com" +
"&subject=" + Uri.encode(subject) +
"&body=" + Uri.encode(bodyText);
Intent emailIntent = new Intent(Intent.ACTION_SENDTO);
emailIntent.setData(Uri.parse(mailto));
try {
startActivity(emailIntent);
} catch (ActivityNotFoundException e) {
//TODO: Handle case where no email app is available
}
是指向他/她的要点的链接。我已经尝试过了,但没有帮助。我想,附加功能并不是用来过滤选择器中的应用程序的
String mailto = "mailto:bob@example.org" +
"?cc=" + "alice@example.com" +
"&subject=" + Uri.encode(subject) +
"&body=" + Uri.encode(bodyText);
Intent emailIntent = new Intent(Intent.ACTION_SENDTO);
emailIntent.setData(Uri.parse(mailto));
try {
startActivity(emailIntent);
} catch (ActivityNotFoundException e) {
//TODO: Handle case where no email app is available
}