Использование Android Intent.ACTION_SEND для отправки электронной почты

Я использую Intent.ACTION_SEND для отправки электронной почты. Однако, когда я вызываю intent он показывает варианты отправки сообщения, отправки электронной почты, а также для отправки через Bluetooth. Я хочу, чтобы он показывал только варианты отправки электронной почты. Как я могу это сделать?

 Intent email = new Intent(android.content.Intent.ACTION_SEND); email.setType("application/octet-stream"); 

РЕДАКТИРОВАТЬ:
Вы также можете попробовать установить тип "message/rfc822" .

попробуй это….

@Ganapathy: попробуйте этот код для отображения gmail

 Intent gmail = new Intent(Intent.ACTION_VIEW); gmail.setClassName("com.google.android.gm","com.google.android.gm.ComposeActivityGmail"); gmail.putExtra(Intent.EXTRA_EMAIL, new String[] { "jckdsilva@gmail.com" }); gmail.setData(Uri.parse("jckdsilva@gmail.com")); gmail.putExtra(Intent.EXTRA_SUBJECT, "enter something"); gmail.setType("plain/text"); gmail.putExtra(Intent.EXTRA_TEXT, "hi android jack!"); startActivity(gmail); 

Это поможет вам.

 On your button click : Intent email = new Intent(Intent.ACTION_SEND); email.putExtra(Intent.EXTRA_EMAIL, new String[]{"youremail@yahoo.com"}); email.putExtra(Intent.EXTRA_SUBJECT, "subject"); email.putExtra(Intent.EXTRA_TEXT, "message"); email.setType("message/rfc822"); startActivity(Intent.createChooser(email, "Choose an Email client :")); 

Я не беру на себя ответственность за этот ответ, но я считаю, что он дает лучший ответ на этот пост.

Это распространенное заблуждение использовать text / plain или text / html. Это вызовет любое приложение, которое может обрабатывать простые текстовые файлы или текстовые файлы без какого-либо контекста, включая Google Диск, Dropbox, Evernote и Skype.

Вместо этого используйте ACTION_SENDTO , предоставляя mailto: Uri

 intent = new Intent(Intent.ACTION_SENDTO, Uri.parse("mailto:")); 

Затем вы можете продолжить использование выбора, как это предлагается с помощью других ответов.

Отвечено на @PaulLammertsma здесь Выбор электронной почты для Android

Использование типа message/rfc822 как указано здесь: принудительная отправка ACTION_SEND с помощью электронной почты решает проблему.

У меня была аналогичная проблема с моим приложением. Недавно я нашел эту ссылку на официальном сайте разработчиков Android, который действительно помогает! Общие намерения: электронная почта

TL; DR:

 Intent intent = new Intent(Intent.ACTION_SENDTO); intent.setData(Uri.parse("mailto:")); 

Теперь вам будут показаны только клиенты электронной почты!

Вы можете добавить тему и тело, выполнив следующие действия:

 intent.putExtra(Intent.EXTRA_SUBJECT, "Subject"); intent.putExtra(Intent.EXTRA_TEXT, "Body" ); 

Первое решение: попробуйте быть более конкретным в ваших параметрах Intent. Добавление получателя сообщения, например

 emailIntent .putExtra(android.content.Intent.EXTRA_EMAIL, new String[] {"user@example.com"}); 

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

Я замечаю, что это довольно старый вопрос, но это первый результат при поиске решения «Отправить почту», и все ответы имеют общую проблему:

Использование Intent.ACTION_SEND и intent.setType("message/rfc822") приведет к выбору, который не только отображает почтовые приложения, но и все приложения, которые могут обрабатывать любую поддержку типа MIME посредством сообщения / rfc822, например .mhtml , .mht , .mime , Помимо почтовых приложений это могут быть Google Диск, Dropbox, Evernote и т . Д.

Единственное решение, которое я нашел, чтобы ограничить выбор только почтовыми приложениями, заключается в том, чтобы вместо этого использовать Intent.ACTION_SENDTO:

 Intent intent = new Intent(Intent.ACTION_SENDTO, Uri.fromParts("mailto","address@example.com", null)); intent.putExtra(Intent.EXTRA_SUBJECT, "My Mail"); intent.putExtra(Intent.EXTRA_TEXT , "My Message"); try { startActivity(Intent.createChooser(i, "Send mail...")); } catch (android.content.ActivityNotFoundException ex) { Toast.makeText(MainActivity.this, "There are no email clients installed.", Toast.LENGTH_SHORT).show(); } 

Лучший код, чтобы ограничить его отправкой только электронной почты. Установите этот тип, чтобы отправить только электронное письмо. i.setType("message/rfc822");

  Intent i = new Intent(Intent.ACTION_SEND); i.setType("message/rfc822"); i.putExtra(Intent.EXTRA_EMAIL , new String[]{"skapis1@outlook.com"}); i.putExtra(Intent.EXTRA_SUBJECT, "subject of email"); i.putExtra(Intent.EXTRA_TEXT , "body of email"); try { startActivity(Intent.createChooser(i, "Send mail...")); } catch (android.content.ActivityNotFoundException ex) { Toast.makeText(Firstclass.this, "There are no email clients installed.", Toast.LENGTH_SHORT).show(); } 

Это комбинация решений Джека Дзилвы и Йиньэша Майяни:

  try { Intent gmailIntent = new Intent(Intent.ACTION_SEND); gmailIntent.setType("text/html"); final PackageManager pm = _activity.getPackageManager(); final List<ResolveInfo> matches = pm.queryIntentActivities(gmailIntent, 0); String gmailActivityClass = null; for (final ResolveInfo info : matches) { if (info.activityInfo.packageName.equals("com.google.android.gm")) { gmailActivityClass = info.activityInfo.name; if (gmailActivityClass != null && !gmailActivityClass.isEmpty()) { break; } } } gmailIntent.setClassName("com.google.android.gm", gmailActivityClass); gmailIntent.putExtra(Intent.EXTRA_EMAIL, new String[] { "yourmail@gmail.com" }); gmailIntent.putExtra(Intent.EXTRA_SUBJECT, "Subject"); gmailIntent.putExtra(Intent.EXTRA_CC, "cc@gmail.com"); // if necessary gmailIntent.putExtra(Intent.EXTRA_TEXT, "Email message"); gmailIntent.setData(Uri.parse("yourmail@gmail.com")); this._activity.startActivity(gmailIntent); } catch (Exception e) { Intent i = new Intent(Intent.ACTION_SEND); i.putExtra(Intent.EXTRA_EMAIL, new String[] { "yourmail@gmail.com" }); i.putExtra(Intent.EXTRA_SUBJECT, "Subject"); i.putExtra(Intent.EXTRA_CC, "cc@gmail.com"); // if necessary i.putExtra(Intent.EXTRA_TEXT, "Email message"); i.setType("plain/text"); this._activity.startActivity(i); } 

Итак, сначала он попытается открыть приложение gmail, и в случае, если у пользователя его нет, тогда будет реализован второй подход.

[Решение для API LEVEL> = 15]

Я, наконец, добился отправки электронной почты С прикрепленными файлами ТОЛЬКО почтовых клиентов . Я пишу это здесь, потому что мне потребовалось много времени, и это может быть полезно для других.

Проблема в:

  • Intent.ACTION_SENDTO принимает URI данных (так что вы можете указать схему «mailto:»), но он не принимает Intent: EXTRA_STREAM.

  • Intent.ACTION_SEND принимает Intent: EXTRA_STREAM (поэтому вы можете добавить вложение), но для этого требуется только тип (не URI данных), поэтому вы не можете указать схему «mailto:».

Таким образом, Intent.ACTION_SEND позволяет пользователю выбирать из нескольких видов деятельности, даже если вы устанавливаетеType («message / rfc822»), потому что это приложение / действия может управлять всеми типами файлов (типично GDrive / Dropbox Apps) и даже даже отправлять файлы сообщений электронной почты.

Решение находится в методе setSelector. С помощью этого метода вы можете использовать Intent.ACTION_SENDTO для выбора Activity, но затем отправить Intent.ACTION_SEND Intent.

Здесь мой код решения (приложение появилось из FileProvider, но это мог быть любой файл):

 { Intent emailSelectorIntent = new Intent(Intent.ACTION_SENDTO); emailSelectorIntent.setData(Uri.parse("mailto:")); final Intent emailIntent = new Intent(Intent.ACTION_SEND); emailIntent.putExtra(Intent.EXTRA_EMAIL, new String[]{"address@mail.com"}); emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Subject"); emailIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); emailIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION); emailIntent.setSelector( emailSelectorIntent ); Uri attachment = FileProvider.getUriForFile(this, "my_fileprovider", myFile); emailIntent.putExtra(Intent.EXTRA_STREAM, attachment); if( emailIntent.resolveActivity(getPackageManager()) != null ) startActivity(emailIntent); }