Android Intent Chooser仅显示电子邮件选项

时间:2011-06-06 17:41:38

标签: android android-intent xamarin.android

我的应用程序集成了电子邮件,用户可以直接从应用程序提交错误报告,反馈等。我正在使用application / octet-stream作为Intent的SetType。当您提交电子邮件时,您将获得内容选择器,并显示来自Evernote,Facebook,电子邮件等的各种项目。

如何让此选择器仅显示电子邮件,以免将用户与适合内容选择器类型的所有其他项目混淆?

谢谢。

8 个答案:

答案 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功能时遇到了这个问题,这是所有已安装电子邮件应用的选择器意图:

Chooser Intent Screenshot

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类型都有一种更通用的方法。

请参阅此帖子:How to customize share intent in Android?

答案 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);  

请参阅:http://www.gaanza.com/blog/email-client-intent-android/

答案 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是其要旨的链接。