Only Email apps to resolve an Intent

后端 未结 14 1538
执念已碎
执念已碎 2020-12-03 06:30

I have a problem .. I want only email activities to resolve intent ACTION.SEND but beside email I get other apps as well (e.g TubeMate) even though I have set the mime type

相关标签:
14条回答
  • 2020-12-03 07:10

    Here is how I send email with attachments (proved to work with attachments of various MIME types, even in the same email) and only allow email apps (it also has a solution for cases that no app support "mailto"). At first, we try and get activities that support mailto: format. If none are found then we get all activities that supports the message/rfc822 MIME type. We select the default app (if there is a default) or allow the user to select from the available apps. If no app supports mailto: and message/rfc822, then we use the default chooser.

    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);
        }
    }
    
    0 讨论(0)
  • 2020-12-03 07:10

    This work for me to open only email apps:

    Intent intent = new Intent(Intent.ACTION_SENDTO);
    intent.setData(Uri.parse("mailto:jorgesys12@gmail.com"));
    startActivity(intent);
    
    0 讨论(0)
  • 2020-12-03 07:13
     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));
        }
    }
    

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

    0 讨论(0)
  • 2020-12-03 07:13

    Please check : 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);
        }
    
    0 讨论(0)
  • 2020-12-03 07:13

    Following three lines of code is sufficient to finish your task, nothing EXTRAS needed. Hope it helps.

    Intent intent = new Intent(Intent.ACTION_SENDTO);
    intent.setData(Uri.parse("mailto:destination_gmail@gmail.com"));
    startActivity(Intent.createChooser(intent, "Send email using.."));
    
    0 讨论(0)
  • 2020-12-03 07:13

    You can also use this. It's more efficient

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

    This code sample show only email client which are currently installed on your device

    0 讨论(0)
提交回复
热议问题