26

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

我怎样才能让这个选择器只显示电子邮件,以免将用户与适合内容选择器类型的所有其他项目混淆?

谢谢你。

4

10 回答 10

39

要解决此问题,只需遵循官方文档即可。最重要的考虑是:

  1. 标志是ACTION_SENDTO,而不是ACTION_SEND

  2. 意图的方法的setData,

    intent.setData(Uri.parse("mailto:")); // 只有电子邮件应用程序应该处理这个

如果您发送一个空Extra的,if()最后的 将不起作用,应用程序将不会启动电子邮件客户端。

这对我有用。根据安卓文档。如果您想确保您的意图仅由电子邮件应用程序(而不是其他短信或社交应用程序)处理,请使用 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);
    }
}

https://developer.android.com/guide/components/intents-common.html#Email

于 2015-07-21T18:57:08.067 回答
14

我假设您正在使用该ACTION_SEND Intent操作,因为您没有费心实际说明您正在使用的内容,但您同意@Aleadam 的评论。

我使用 application/octet-stream 作为 Intent 的 SetType。

那句话中的任何内容都不会限制电子邮件。

ACTION_SEND是一个通用Intent操作,可以由任何想要的应用程序支持。您所做的只是指出您正在共享的数据以及该数据的 MIME 类型——从那里,用户可以从可用活动中进行选择。

正如@Jasoon 所指出的,您可以尝试message/rfc822作为 MIME 类型。然而,这并不表示“只提供电子邮件客户端”——它表示“提供任何支持message/rfc822数据的东西”。这可能很容易包括一些不是电子邮件客户端的应用程序。

如果您特别想通过电子邮件发送某些内容,请将 JavaMail 集成到您的应用程序中,或者在您的 Web 服务器上编写一个电子邮件转发脚本并调用它,或者其他方式。如果您使用ACTION_SEND,则暗示用户想要什么才是最重要的,并且您希望用户能够通过用户选择的任何方式发送某某数据。

于 2011-06-06T19:48:33.843 回答
11

只是在实现 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);
}
于 2017-03-01T13:11:32.223 回答
2

有一种更通用的方法可以使用任何 MIME 类型。

请参阅这篇文章:如何在 Android 中自定义共享意图?

于 2012-02-27T02:36:40.367 回答
0

可以将意图选择器的选择限制为几个选项。这个问题的答案中的代码就是一个很好的例子。本质上,您必须创建一个 LabeledIntents 列表以提供给意图选择器,然后将其包含在其列表中。请注意,此解决方案不适用于排除(某些应用程序被排除,而其余应用程序保留),而是您必须选择要显示的应用程序。希望能帮助到你!

于 2015-05-02T02:21:16.260 回答
0

Kotlin 答案

如果您只需要显示电子邮件应用程序,然后您只想打开收件箱不打开新的电子邮件写作),您需要执行 A 和 B:

A)由于 Android 11 的包可见性更新,在 Android 11的AndroidManifest.xml文件中添加以下代码:

<queries>
    <intent>
        <action android:name="android.intent.action.SENDTO" />
        <data android:scheme="mailto" />
    </intent>
    <intent>
        <action android:name="android.intent.action.CHOOSER" />
    </intent>
</queries>

B)使用以下功能显示电子邮件选择器:

// Show email app list.
fun showEmailAppList() {

    // Email app list.
    val emailAppLauncherIntents: MutableList<Intent?> = ArrayList()

    // Create intent which can handle only by email apps.
    val emailAppIntent = Intent(Intent.ACTION_SENDTO)
    emailAppIntent.data = Uri.parse("mailto:")

    // Find from all installed apps that can handle email intent and check version. 
    val emailApps = packageManager.queryIntentActivities(
        emailAppIntent,
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) 0 else PackageManager.MATCH_ALL
    )

    // Collect email apps and put in intent list.
    for (resolveInfo in emailApps) {
        val packageName = resolveInfo.activityInfo.packageName
        val launchIntent = packageManager.getLaunchIntentForPackage(packageName)
        emailAppLauncherIntents.add(launchIntent)
    }

    // Create chooser with created intent list to show email apps of device.
    val chooserIntent = Intent.createChooser(Intent(), "OPEN EMAIL APP")
    chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, emailAppLauncherIntents.toTypedArray())
    startActivity(chooserIntent)
}

结果:

仅显示电子邮件应用程序

于 2021-12-21T20:03:35.597 回答
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[]{"contact@brightsociety.com"});

    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();
    }
}
于 2017-07-25T11:38:53.830 回答
-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
}

这是他/她的要点的链接

于 2020-01-16T09:18:49.200 回答
-1

它适用于所有设备。它只会显示电子邮件应用程序

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();
        }
}
于 2017-07-25T11:47:37.140 回答
-1

解决方法很简单:

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/

于 2018-04-15T21:38:09.643 回答