我的应用程序集成了电子邮件,用户可以直接从应用程序提交错误报告,反馈等。我正在使用application / octet-stream作为Intent的SetType。当您提交电子邮件时,您将获得内容选择器,并显示来自Evernote,Facebook,电子邮件等的各种项目。
如何让此选择器仅显示电子邮件,以免将用户与适合内容选择器类型的所有其他项目混淆?
谢谢。
答案 0 :(得分:32)
我用简单的代码行解决了这个问题,如android文档说明(https://developer.android.com/guide/components/intents-common.html#Email)
最重要的是旗帜:它是 ACTION_SENDTO
,而不是 ACTION_SEND
另一个重要的是
intent.setData(Uri.parse("mailto:")); ***// only email apps should handle this***
顺便说一句,如果你发送一个空的Extra
,那么最后的if()
将无效,应用程序将无法启动电子邮件客户端。
这对我有用。根据Android文档。如果您想确保仅通过电子邮件应用程序(而不是其他文本消息或社交应用程序)处理您的意图,请使用ACTION_SENDTO操作并包含“mailto:”数据方案。例如:
public void composeEmail(String[] addresses, String subject) {
Intent intent = new Intent(Intent.ACTION_SENDTO);
intent.setData(Uri.parse("mailto:")); // only email apps should handle this
intent.putExtra(Intent.EXTRA_EMAIL, addresses);
intent.putExtra(Intent.EXTRA_SUBJECT, subject);
if (intent.resolveActivity(getPackageManager()) != null) {
startActivity(intent);
}
}
答案 1 :(得分:13)
我假设您正在使用ACTION_SEND
Intent
操作,因为您没有真正说明您正在使用的内容,但您同意@ Aleadam的评论。
我正在使用application / octet-stream作为Intent的SetType。
该句中没有任何内容限制电子邮件。
ACTION_SEND
是一项通用的Intent
操作,任何想要的应用程序都可以支持该操作。您所做的就是指出您要共享的数据以及该数据的MIME类型 - 从那里,用户可以从可用的活动中进行选择。
如@Jasoon所示,您可以尝试message/rfc822
作为MIME类型。但是,这并不表示“仅提供电子邮件客户端” - 它表示“提供支持message/rfc822
数据的任何内容”。这可能很容易包括一些不是电子邮件客户端的应用程序。
如果您特别想通过电子邮件发送内容,请将JavaMail集成到您的应用中,或者在您的Web服务器上编写电子邮件转发脚本并调用它或其他内容。如果您使用ACTION_SEND
,则隐含地声明用户想要的是重要的,并且您希望用户能够通过用户选择的任何方式发送某些数据。
答案 2 :(得分:5)
在实施Magic Link功能时遇到了这个问题,这是所有已安装电子邮件应用的选择器意图:
private void openEmailApp() {
List<Intent> emailAppLauncherIntents = new ArrayList<>();
//Intent that only email apps can handle:
Intent emailAppIntent = new Intent(Intent.ACTION_SENDTO);
emailAppIntent.setData(Uri.parse("mailto:"));
emailAppIntent.putExtra(Intent.EXTRA_EMAIL, "");
emailAppIntent.putExtra(Intent.EXTRA_SUBJECT, "");
PackageManager packageManager = getPackageManager();
//All installed apps that can handle email intent:
List<ResolveInfo> emailApps = packageManager.queryIntentActivities(emailAppIntent, PackageManager.MATCH_ALL);
for (ResolveInfo resolveInfo : emailApps) {
String packageName = resolveInfo.activityInfo.packageName;
Intent launchIntent = packageManager.getLaunchIntentForPackage(packageName);
emailAppLauncherIntents.add(launchIntent);
}
//Create chooser
Intent chooserIntent = Intent.createChooser(new Intent(), "Select email app:");
chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, emailAppLauncherIntents.toArray(new Parcelable[emailAppLauncherIntents.size()]));
startActivity(chooserIntent);
}
答案 3 :(得分:2)
使用任何MIME类型都有一种更通用的方法。
答案 4 :(得分:1)
适用于所有设备。它只会显示电子邮件应用
<script type="text/javascript">
$('#submit').submit(function() {
$.ajax({ // create an AJAX call...
data: $(this).serialize(),
type: $(this).attr('method'),
url: $(this).attr('action'),
success: function(response) {
$('#submit').html(response);
}
});
return false;
});
</script>
<form action="<?php echo $action; ?>" method="post">
Your name: <input type="text" name="name" required><br>
Your e-mail: <input type="text" name="email" required><br>
<input type="submit" value="submit" name="submit">
</form
答案 5 :(得分:0)
适用于所有设备。它只会显示电子邮件应用
public static void shareViaMail(Activity activity, String title, String body, String filePath) {
Uri URI = Uri.parse("file://" + filePath);
final Intent emailIntent = new Intent(Intent.ACTION_VIEW);
emailIntent.setData(Uri.parse("mailto:"));
emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, new String[]{"xyz@gmail.com"});
/*if you want to attach something*/
if (URI != null) {
emailIntent.putExtra(Intent.EXTRA_STREAM, URI);
}
try {
activity.startActivity(emailIntent);
} catch (Exception e) {
((BaseActivity) activity).showToast("Gmail App is not installed");
e.printStackTrace();
}
}
答案 6 :(得分:0)
解决方案很简单:
Intent testIntent = new Intent(Intent.ACTION_VIEW);
Uri data = Uri.parse("mailto:?subject=" + "blah blah subject" + "&body=" + "blah blah body" + "&to=" + "sendme@me.com");
testIntent.setData(data);
startActivity(testIntent);
答案 7 :(得分:-1)
经过大量搜索和测试,我终于找到了一个完美的解决方案。感谢开源开发人员cketti分享了他/她简洁明了的解决方案。
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
}
this是其要旨的链接。