【问题标题】:Only Email apps to resolve an Intent只有电子邮件应用程序才能解决 Intent
【发布时间】:2011-09-24 07:10:57
【问题描述】:

我有一个问题 .. 我只想要电子邮件活动来解决意图 ACTION.SEND 但除了电子邮件之外,即使我已将 mime 类型设置为“消息/rfc822”,我也可以获得其他应用程序(例如 TubeMate)...知道如何让电子邮件应用程序解决它..

【问题讨论】:

  • 请保持您的代码不变。如果您的数据确实是message/rfc822 格式,那么是否使用 TubeMate 的决定权在于用户,而不是您。
  • @CommonsWare 不是真的...我有一个向支持团队发送电子邮件的活动,我不希望用户除了发送电子邮件之外有任何其他选择。 PS:我是忠实粉丝,上个月买了你的书:D
  • 这是重复的问题。我从 API 15 here 回答了一种方法

标签: android email android-intent


【解决方案1】:
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);

重点是使用ACTION_SENDTO 作为操作,mailto: 作为数据。如果您想让用户指定目标电子邮件,请使用 mailto:;如果您自己指定电子邮件,请使用mailto:name@domain.com

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

【讨论】:

  • 这是过滤电子邮件客户端(或其他可以处理 mailto 协议的软件)的好方法,但有一个明显的例外:ACTION_SENDTO 不允许您发送任何附件。因此,除非您不处理附件,否则它会起作用,但如果您这样做,则选择“message/rfc822”方法。
  • @MikeCamino 在 4.1 附件中为我在 gmail 中工作
  • 完美解决方案。谢谢。
  • @konopko 您是如何使用 ACTION_SENDTO 发送附件的?
  • 它就像一个魅力..有没有办法显示“只一次”,“总是”选项,我的意思是用户选择选项,在这个
【解决方案2】:

这是我发送带有附件的电子邮件的方式(证明可以使用各种 MIME 类型的附件,即使在同一封电子邮件中)并且只允许电子邮件应用程序(它也有一个解决方案,用于没有应用程序支持“mailto”的情况)。 首先,我们尝试获取支持mailto: 格式的活动。如果没有找到,那么我们将获得所有支持message/rfc822 MIME 类型的活动。 我们选择默认应用(如果有默认应用)或允许用户从可用应用中进行选择。 如果没有应用支持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);
    }
}

【讨论】:

  • 很棒的修复! rfc822 的东西甚至都不起作用,我不知道为什么每个人都在推荐它......也许它曾经在旧的 Android 上工作过
【解决方案3】:
 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));
    }
}

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

【讨论】:

  • 如文档所述,Intent.ACTION_SENDTO 适用于非附件事件,如果您设置附件它不会被附加。这就是问题所在。
【解决方案4】:

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

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

【讨论】:

【解决方案5】:

你也可以使用:

//writes messages only to email clients
public void setWriteEmailButton() {
    btnWriteMail.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View arg0) {
            Intent i = new Intent(Intent.ACTION_SENDTO);
            i.setData(Uri.parse("mailto:"));
            i.putExtra(Intent.EXTRA_EMAIL  , new String[]{mConsultantInfos.getConsultantEMail()});
            i.putExtra(Intent.EXTRA_SUBJECT, mContext.getString(R.string.txtSubjectConsultantMail));
            i.putExtra(Intent.EXTRA_TEXT   , "");
            try {
                startActivity(Intent.createChooser(i, mContext.getString(R.string.txtWriteMailDialogTitle)));
            } catch (android.content.ActivityNotFoundException ex) {
                UI.showShortToastMessage(mContext, R.string.msgNoMailClientsInstalled);
            }
        }
    });
}

玩得开心(两者结合;))

【讨论】:

  • 这恰好适用于某些电子邮件应用程序,而不适用于其他应用程序。在这些“其他”中,有 K-9(我相信,除非您在撰写本文时拥有最新版本)。我强烈建议不要使用这种混合方法。
【解决方案6】:

这对我来说只能打开电子邮件应用程序:

Intent intent = new Intent(Intent.ACTION_SENDTO);
intent.setData(Uri.parse("mailto:jorgesys12@gmail.com"));
startActivity(intent);

【讨论】:

  • 有问题吗?您的邮件?
  • 在 kitkat 中遇到问题,即我尝试以编程方式拨打电话,但我不能
【解决方案7】:

试试这个

String subject = "Feedback";
            String bodyText = "Enter text email";
            String mailto = "mailto:bob@example.org" +
                    "?cc=" + "" +
                    "&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
            }

信用:https://medium.com/@cketti/android-sending-email-using-intents-3da63662c58f

【讨论】:

    【解决方案8】:

    当我使用意图时,android.content.Intent.ACTION_SENDTO 对我不起作用,因为它显示了许多应用程序,有些应用程序不是电子邮件客户端。我找到了这种方式,它对我来说非常有效。

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

    【讨论】:

      【解决方案9】:

      这对我有用

      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")); 
      

      【讨论】:

        【解决方案10】:

        请查看:https://developer.android.com/guide/components/intents-common#ComposeEmail

         String[] sendTo = {}; // people who will receive the email
            String subject = "implicit intent | sending email";
            String message = "Hi, this is just a test to check implicit intent.";
            Intent email = new Intent(Intent.ACTION_SENDTO);
            email.setData(Uri.parse("mailto:")); // only email apps should handle this
            email.putExtra(Intent.EXTRA_EMAIL, sendTo);
            email.putExtra(Intent.EXTRA_SUBJECT, subject);// email subject / title
            email.putExtra(Intent.EXTRA_TEXT, message);//message that you want to send
        
            // Create intent to show the chooser dialog
            Intent chooser = Intent.createChooser(email, "Choose an Email client :");
            // Verify the original intent will resolve to at least one activity
            if (chooser.resolveActivity(getPackageManager()) != null) {
                startActivity(chooser);
            }
        

        【讨论】:

          【解决方案11】:

          这是一种绝对简单且 100% 有效的方法。感谢开源开发者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 是指向他/她的要点的链接。

          【讨论】:

            【解决方案12】:

            这是一个仅启动电子邮件应用程序的代码 sn-p。

            Intent intent = new Intent(Intent.ACTION_SENDTO);
            intent.setData(Uri.parse("mailto:example@example.com"));
            intent.putExtra(Intent.EXTRA_SUBJECT, "This is the subject"));
            intent.putExtra(Intent.EXTRA_TEXT, "Hi, how're you doing?"));
            
            if (intent.resolveActivity(getActivity().getPackageManager()) != null) {
                startActivity(intent);
            }
            

            我希望这会有所帮助。

            【讨论】:

              【解决方案13】:

              以下三行代码就足以完成您的任务,无需 EXTRAS。希望对您有所帮助。

              Intent intent = new Intent(Intent.ACTION_SENDTO);
              intent.setData(Uri.parse("mailto:destination_gmail@gmail.com"));
              startActivity(Intent.createChooser(intent, "Send email using.."));
              

              【讨论】:

                【解决方案14】:

                您也可以使用它。效率更高

                Intent mailIntent = new Intent(Intent.ACTION_SEND);
                
                  String mailTo[] = new String[] { "MAIL_TO_1", "MAIL_TO_2" };
                  mailIntent.putExtra(Intent.EXTRA_EMAIL, mailTo);
                  mailIntent.putExtra(Intent.EXTRA_SUBJECT, "Your subject");
                  mailIntent.putExtra(Intent.EXTRA_TEXT, "MailsBody");
                  mailIntent.setType("plain/text");
                
                  startActivity(Intent.createChooser(mailIntent, "only email client"));
                

                此代码示例仅显示您设备上当前安装的电子邮件客户端

                【讨论】:

                • 这个答案在这个问题的上下文中是完全错误的。这将在我的一台设备上显示十几个应用程序可供选择,其中两个是电子邮件应用程序。另外,请详细说明更高效是什么意思。
                • MIME 类型是“text/plain”而不是“plain/text”
                猜你喜欢
                • 1970-01-01
                • 2010-11-25
                • 1970-01-01
                • 1970-01-01
                • 2012-01-27
                • 2011-05-03
                • 1970-01-01
                • 2016-03-20
                相关资源
                最近更新 更多