仅限电子邮件应用以解析意图

Wah*_*han 29 email android android-intent

我有一个问题..我只想要电子邮件活动来解决意图ACTION.SEND但在电子邮件旁边我也得到了其他应用程序(例如TubeMate),即使我已将mime类型设置为'message/rfc822'...任何想法如何我可以获得电子邮件应用程序来解决它..

Myk*_*dai 70

String recepientEmail = ""; // either set to destination email or leave empty
Intent intent = new Intent(Intent.ACTION_SENDTO);
intent.setData(Uri.parse("mailto:" + recepientEmail));
startActivity(intent);
Run Code Online (Sandbox Code Playgroud)

关键是要ACTION_SENDTO用作动作和mailto:数据.如果您想让用户指定目标电子邮件,请使用mailto:; 如果您自己指定电子邮件,请使用mailto:name@domain.com

建议的方法过滤所有可以发送电子邮件的应用程序(例如默认电子邮件应用程序或gmail)

  • 这是过滤掉电子邮件客户端(或其他可以处理mailto协议的软件)的好方法,但有一个重要的例外:ACTION_SENDTO不允许您发送任何附件.因此,在您不处理附件之前,它会起作用,但如果您这样做,则选择"message/rfc822"方法. (9认同)
  • 4.1附件中的@MikeCamino适用于gmail (4认同)

Muz*_*ant 15

以下是我发送带附件的电子邮件(证明可以使用各种MIME类型的附件,甚至在同一封电子邮件中),并且只允许电子邮件应用程序(它还有一个解决方案,适用于没有应用支持"mailto"的情况).首先,我们尝试获得支持mailto:格式的活动.如果没有找到,那么我们将获得支持message/rfc822MIME类型的所有活动.我们选择默认应用程序(如果有默认值)或允许用户从可用应用程序中进行选择.如果没有应用程序支持mailto:message/rfc822,然后我们使用默认选择器.

public static void sendEmail(final Context p_context, final String p_subject, final String p_body, final ArrayList<String> p_attachments)
{
    try
    {
        PackageManager pm = p_context.getPackageManager();
        ResolveInfo selectedEmailActivity = null;

        Intent emailDummyIntent = new Intent(Intent.ACTION_SENDTO);
        emailDummyIntent.setData(Uri.parse("mailto:some@emaildomain.com"));

        List<ResolveInfo> emailActivities = pm.queryIntentActivities(emailDummyIntent, 0);

        if (null == emailActivities || emailActivities.size() == 0)
        {
            Intent emailDummyIntentRFC822 = new Intent(Intent.ACTION_SEND_MULTIPLE);
            emailDummyIntentRFC822.setType("message/rfc822");

            emailActivities = pm.queryIntentActivities(emailDummyIntentRFC822, 0);
        }

        if (null != emailActivities)
        {
            if (emailActivities.size() == 1)
            {
                selectedEmailActivity = emailActivities.get(0);
            }
            else
            {
                for (ResolveInfo currAvailableEmailActivity : emailActivities)
                {
                    if (true == currAvailableEmailActivity.isDefault)
                    {
                        selectedEmailActivity = currAvailableEmailActivity;
                    }
                }
            }

            if (null != selectedEmailActivity)
            {
                // Send email using the only/default email activity
                sendEmailUsingSelectedEmailApp(p_context, p_subject, p_body, p_attachments, selectedEmailActivity);
            }
            else
            {
                final List<ResolveInfo> emailActivitiesForDialog = emailActivities;

                String[] availableEmailAppsName = new String[emailActivitiesForDialog.size()];
                for (int i = 0; i < emailActivitiesForDialog.size(); i++)
                {
                    availableEmailAppsName[i] = emailActivitiesForDialog.get(i).activityInfo.applicationInfo.loadLabel(pm).toString();
                }

                AlertDialog.Builder builder = new AlertDialog.Builder(p_context);
                builder.setTitle(R.string.select_mail_application_title);
                builder.setItems(availableEmailAppsName, new DialogInterface.OnClickListener()
                {
                    @Override
                    public void onClick(DialogInterface dialog, int which)
                    {
                        sendEmailUsingSelectedEmailApp(p_context, p_subject, p_body, p_attachments, emailActivitiesForDialog.get(which));
                    }
                });

                builder.create().show();
            }
        }
        else
        {
            sendEmailUsingSelectedEmailApp(p_context, p_subject, p_body, p_attachments, null);
        }
    }
    catch (Exception ex)
    {
        Log.e(TAG, "Can't send email", ex);
    }
}

protected static void sendEmailUsingSelectedEmailApp(Context p_context, String p_subject, String p_body, ArrayList<String> p_attachments, ResolveInfo p_selectedEmailApp)
{
    try
    {
        Intent emailIntent = new Intent(Intent.ACTION_SEND_MULTIPLE);

        String aEmailList[] = { "some@emaildomain.com"};

        emailIntent.putExtra(Intent.EXTRA_EMAIL, aEmailList);
        emailIntent.putExtra(Intent.EXTRA_SUBJECT, null != p_subject ? p_subject : "");
        emailIntent.putExtra(Intent.EXTRA_TEXT, null != p_body ? p_body : "");

        if (null != p_attachments && p_attachments.size() > 0)
        {
            ArrayList<Uri> attachmentsUris = new ArrayList<Uri>();

            // Convert from paths to Android friendly Parcelable Uri's
            for (String currAttachemntPath : p_attachments)
            {
                File fileIn = new File(currAttachemntPath);
                Uri currAttachemntUri = Uri.fromFile(fileIn);
                attachmentsUris.add(currAttachemntUri);
            }
            emailIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, attachmentsUris);
        }

        if (null != p_selectedEmailApp)
        {
            Log.d(TAG, "Sending email using " + p_selectedEmailApp);
            emailIntent.setComponent(new ComponentName(p_selectedEmailApp.activityInfo.packageName, p_selectedEmailApp.activityInfo.name));

            p_context.startActivity(emailIntent);
        }
        else
        {
            Intent emailAppChooser = Intent.createChooser(emailIntent, "Select Email app");

            p_context.startActivity(emailAppChooser);
        }
    }
    catch (Exception ex)
    {
        Log.e(TAG, "Error sending email", ex);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 很棒的修复!rfc822 的东西甚至不起作用,我不知道为什么每个人都推荐它......也许它曾经适用于较旧的 Android (2认同)

Gan*_*nna 9

 private void sendEmail(Connect connect) {
    Intent email = new Intent(Intent.ACTION_SENDTO);
    email.setData(Uri.parse("mailto:"));
    email.putExtra(Intent.EXTRA_EMAIL, new String[]{connect.getEmail()});
    email.putExtra(Intent.EXTRA_SUBJECT, "");
    email.putExtra(Intent.EXTRA_TEXT, "");
    try {
        startActivity(Intent.createChooser(email, getString(R.string.choose_email_client)));
    } catch (ActivityNotFoundException activityNotFoundException) {
        UIUtils.showShortSnackBar(fragmentConnectLayout, getString(R.string.no_email_client));
    }
}
Run Code Online (Sandbox Code Playgroud)

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


dde*_*ele 5

在 Android 中,不存在电子邮件活动之类的东西。也没有可以创建仅包含电子邮件应用程序的意图过滤器。每个应用程序(或活动)都可以定义自己的意图过滤器。

因此,当使用意图 ACTION_SEND 时,您必须依靠用户的智能从选择器中选择他最喜欢的电子邮件应用程序(而不是 TubeMate)。

  • 同意。事实上,我刚刚在博客上谈到了这一点:http://commonsware.com/blog/2011/06/28/share-where-the-user-wants.html (3认同)