Только приложения электронной почты для разрешения намерения - PullRequest
29 голосов
/ 28 июня 2011

У меня проблема ... Я хочу, чтобы только действия с электронной почтой разрешали намерение ACTION.SEND, но помимо электронной почты я получаю и другие приложения (например, TubeMate), хотя я установил тип mime как message / rfc822 ...Любая идея, как я могу получить приложения электронной почты для ее решения ..

Ответы [ 9 ]

69 голосов
/ 28 июня 2011
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)

14 голосов
/ 25 июля 2013

Вот как я отправляю электронное письмо с вложениями (доказано, что оно работает с вложениями различных типов 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);
    }
}
9 голосов
/ 03 августа 2016
 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

4 голосов
/ 29 мая 2014

Это работа для меня, чтобы открыть только почтовые приложения:

Intent intent = new Intent(Intent.ACTION_SENDTO);
intent.setData(Uri.parse("mailto:jorgesys12@gmail.com"));
startActivity(intent);
4 голосов
/ 13 июня 2012

Вы также можете использовать:

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

веселиться (комбинация обоих;))

4 голосов
/ 28 июня 2011

В Android нет такой вещи, как электронная почта.Там также нет фильтра намерений, который можно создать, чтобы включать только почтовые приложения.Каждое приложение (или действие) может определять свои собственные фильтры намерений.

Таким образом, при использовании намерения ACTION_SEND вам придется полагаться на интеллект пользователя, чтобы выбирать свое любимое почтовое приложение из средства выбора (а не TubeMate).

3 голосов
/ 12 июня 2017

Попробуйте это

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

1 голос
/ 08 июня 2018

Когда я использую намерение, 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);
0 голосов
/ 01 октября 2012

Вы также можете использовать это. Это более эффективно

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

В этом примере кода показан только почтовый клиент, установленный на вашем устройстве

...