Как открыть программу электронной почты через Intents (но только программу электронной почты)

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

Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_SUBJECT, subject);
intent.putExtra(Intent.EXTRA_TEXT, message);
Intent mailer = Intent.createChooser(intent, null);
startActivity(mailer);

Однако проблема заключается в том, что ACTION_SEND принимается больше, чем просто программами электронной почты - например, на моем телефоне приложение Facebook, Twitter, reddit - это весело, и даже Bluetooth подходит как жизнеспособные альтернативы для отправки этого сообщения. Сообщение слишком велико для некоторых из них (особенно Twitter).

Есть ли способ ограничить выборщик только приложениями, поддерживающими длинные сообщения (например, электронная почта)? Или есть способ обнаружить приложение, которое пользователь выбрал, и соответствующим образом настроить сообщение?

Ответ 1

Изменение типа MIME - это ответ, это то, что я сделал в своем приложении, чтобы изменить то же поведение. Я использовал intent.setType("message/rfc822");

Ответ 2

Благодаря предложению Pentium10 о том, как работает Linkify, я нашел отличное решение этой проблемы. В принципе, вы просто создаете ссылку "mailto:", а затем вызываете соответствующее намерение для этого.:

Intent intent = new Intent(Intent.ACTION_VIEW);
Uri data = Uri.parse("mailto:?subject=" + subject + "&body=" + body);
intent.setData(data);
startActivity(intent);

В этом решении есть несколько интересных аспектов:

  • Я использую действие ACTION_VIEW, потому что это более подходит для ссылки "mailto:". Вы не можете дать никаких конкретных действий, но тогда вы можете получить некоторые неудовлетворительные результаты (например, он спросит вас, хотите ли вы добавить ссылку на свои контакты).

  • Поскольку это ссылка "share", я просто не указываю адрес электронной почты, даже если это ссылка mailto. Он работает.

  • Нет выбора. Причина этого заключается в том, чтобы позволить пользователю воспользоваться преимуществами по умолчанию; если они установили почтовую программу по умолчанию, тогда она будет их прям к этому, обойдя выборщика вообще (что, кажется, хорошо в моем сознании, вы можете возразить иначе).

Конечно, есть много утонченности, которую я упускаю (например, правильно кодируя тему/тело), ​​но вы должны уметь это понять самостоятельно.

Ответ 3

Это сработало для меня

Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND);
emailIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
emailIntent.setType("vnd.android.cursor.item/email");
emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, new String[] {"[email protected]"});
emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, "My Email Subject");
emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, "My email content");
startActivity(Intent.createChooser(emailIntent, "Send mail using..."));

Ответ 4

Вы пробовали включить Intent.EXTRA_EMAIL extra?

Intent mailer = new Intent(Intent.ACTION_SEND);
mailer.setType("text/plain");
mailer.putExtra(Intent.EXTRA_EMAIL, new String[]{"[email protected]"});
mailer.putExtra(Intent.EXTRA_SUBJECT, subject);
mailer.putExtra(Intent.EXTRA_TEXT, bodyText);
startActivity(Intent.createChooser(mailer, "Send email..."));

Это может ограничить список доступных приложений-получателей...

Ответ 5

Это немного опечатка, так как вам нужно переключить свой тип mimetype:

intent.setType("plain/text"); //Instead of "text/plain"

Ответ 6

Попробуйте изменить тип MIME с простого на сообщение

intent.setType("text/message");

Ответ 7

попробуйте эту опцию:

Intent intentEmail = new Intent(Intent.ACTION_SEND);
intentEmail.setType("message/rfc822");

Ответ 8

Это отлично сработало для меня. здесь вы не используете android.content.Intent.ACTION_SEND, но Intent.ACTION_VIEW

Intent testIntent = new Intent(Intent.ACTION_VIEW);  
Uri data = Uri.parse("mailto:?subject=" + "blah blah subject" + "&body=" + "blah blah body" + "&to=" + "[email protected]");  
testIntent.setData(data);  
startActivity(testIntent);