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

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

Solutions Collecting From Web of "Только приложения электронной почты для разрешения намерения"

 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)

Вот как я отправляю электронную почту с вложениями (доказал, что работаю с вложениями различных типов MIME, даже в том же письме) и разрешает только приложения электронной почты (у нее также есть решение для случаев, когда приложение не поддерживает «mailto»). Сначала мы пытаемся найти действия, поддерживающие формат mailto: Если ни один не найден, мы получаем все действия, которые поддерживают тип MIME message/rfc822 . Мы выбираем приложение по умолчанию (если есть значение по умолчанию) или разрешаем пользователю выбирать из доступных приложений. Если ни одно приложение не поддерживает 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); } } 

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

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

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

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

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

Получайте удовольствие (сочетание обоих;))

  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

Попробуй это

 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

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

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

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