Подтвердить что ты не робот

Только приложения электронной почты для разрешения намерения

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

4b9b3361

Ответ 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:[email protected]

Предлагаемый метод фильтрует все приложение, которое может отправлять электронную почту (например, приложение электронной почты по умолчанию или gmail).

Ответ 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:[email protected]"));

        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[] = { "[email protected]"};

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

Ответ 3

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

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

Ответ 4

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

Intent intent = new Intent(Intent.ACTION_SENDTO);
intent.setData(Uri.parse("mailto:[email protected]"));
startActivity(intent);

Ответ 5

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

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

получают удовольствие (комбинация обоих;))

Ответ 6

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

String subject = "Feedback";
            String bodyText = "Enter text email";
            String mailto = "mailto:[email protected]" +
                    "?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

Ответ 7

 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

Ответ 8

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

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

В этом примере кода отображается только почтовый клиент, который в настоящее время установлен на вашем устройстве.