Отправить письмо Намерение - PullRequest
520 голосов
/ 02 января 2012
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("text/html");
intent.putExtra(Intent.EXTRA_EMAIL, "emailaddress@emailaddress.com");
intent.putExtra(Intent.EXTRA_SUBJECT, "Subject");
intent.putExtra(Intent.EXTRA_TEXT, "I'm email body.");

startActivity(Intent.createChooser(intent, "Send Email"));

Приведенный выше код открывает диалоговое окно, в котором отображаются следующие приложения: - Bluetooth, Google Docs, Yahoo Mail, Gmail, Orkut, Skype и т. Д.

На самом деле я хочу отфильтровать эти параметры списка.Я хочу показывать только приложения, связанные с электронной почтой, например, Gmail, Yahoo Mail.Как это сделать?

Я видел такой пример в приложении «Android Market».

  1. Открыть приложение Android Market
  2. Откройте любое приложение, в котором разработчик указал свой адрес электронной почты.(Если вы не можете найти такое приложение, просто откройте мое приложение: - market: // details? Id = com.becomputer06.vehicle.diary.free, ИЛИ поиск по «Дневнику автомобиля»)
  3. Прокрутите вниз до«РАЗРАБОТЧИК»
  4. Нажмите «Отправить электронную почту»

В этом диалоговом окне отображаются только приложения электронной почты, например, Gmail, Yahoo Mail и т. Д. Он не показывает Bluetooth, Orkut и т. Д. Какой код создает такойдиалог?

Ответы [ 31 ]

8 голосов
/ 23 октября 2013

У меня нормально работает следующий код.

Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("message/rfc822");
intent.putExtra(Intent.EXTRA_SUBJECT, subject);
intent.putExtra(Intent.EXTRA_EMAIL, new String[]{"abc@gmailcom"});
Intent mailer = Intent.createChooser(intent, null);
startActivity(mailer);
6 голосов
/ 26 июля 2013

Редактировать: больше не работает с новыми версиями Gmail

Это был единственный способ, который я нашел в то время, чтобы заставить его работать с любыми персонажами.

Ответ Доремона - правильный путь, поскольку он работает со всеми персонажами в новых версиях Gmail.

Старый ответ:


Вот мой. Кажется, он работает на всех версиях Android, с поддержкой темы и тела сообщения и полной поддержкой символов utf-8:

public static void email(Context context, String to, String subject, String body) {
    StringBuilder builder = new StringBuilder("mailto:" + Uri.encode(to));
    if (subject != null) {
        builder.append("?subject=" + Uri.encode(Uri.encode(subject)));
        if (body != null) {
            builder.append("&body=" + Uri.encode(Uri.encode(body)));
        }
    }
    String uri = builder.toString();
    Intent intent = new Intent(Intent.ACTION_SENDTO, Uri.parse(uri));
    context.startActivity(intent);
}
5 голосов
/ 22 марта 2016

Работает на всех версиях Android:

String[] TO = {"email@server.com"};
    Uri uri = Uri.parse("mailto:email@server.com")
            .buildUpon()
            .appendQueryParameter("subject", "subject")
            .appendQueryParameter("body", "body")
            .build();
    Intent emailIntent = new Intent(Intent.ACTION_SENDTO, uri);
    emailIntent.putExtra(Intent.EXTRA_EMAIL, TO);
    startActivity(Intent.createChooser(emailIntent, "Send mail..."));
4 голосов
/ 22 декабря 2015

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

    Intent intent = new Intent(Intent.ACTION_VIEW);
    intent.setData(Uri.parse("mailto:" + address));
    startActivity(Intent.createChooser(intent, "E-mail"));
4 голосов
/ 04 декабря 2015

Следующий код работал на меня !!

import android.support.v4.app.ShareCompat;
    .
    .
    .
    .
final Intent intent = ShareCompat.IntentBuilder
                        .from(activity)
                        .setType("application/txt")
                        .setSubject(subject)
                        .setText("Hii")
                        .setChooserTitle("Select One")
                        .createChooserIntent()
                        .addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET)
                        .addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

activity.startActivity(intent);
4 голосов
/ 20 марта 2015

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

Intent emailIntent = new Intent(Intent.ACTION_SENDTO,
                                Uri.parse("mailto:" + Uri.encode(address)));

emailIntent.putExtra(Intent.EXTRA_SUBJECT, subject);
emailIntent.putExtra(Intent.EXTRA_TEXT, body);
startActivity(Intent.createChooser(emailIntent, "Send email via..."));
3 голосов
/ 06 января 2018

Большинство из этих ответов работают только для простого случая, когда вы не отправляете вложение .В моем случае мне иногда нужно отправить вложение (ACTION_SEND) или два вложения (ACTION_SEND_MULTIPLE).

Так что я взял лучшие подходы из этой темы и объединил их.Он использует библиотеку поддержки ShareCompat.IntentBuilder, но я показываю только приложения, которые соответствуют ACTION_SENDTO с "mailto:" uri.Таким образом, я получаю только список почтовых приложений с поддержкой вложений:

fun Activity.sendEmail(recipients: List<String>, subject: String, file: Uri, text: String? = null, secondFile: Uri? = null) {
    val originalIntent = createEmailShareIntent(recipients, subject, file, text, secondFile)
    val emailFilterIntent = Intent(Intent.ACTION_SENDTO, Uri.parse("mailto:"))
    val originalIntentResults = packageManager.queryIntentActivities(originalIntent, 0)
    val emailFilterIntentResults = packageManager.queryIntentActivities(emailFilterIntent, 0)
    val targetedIntents = originalIntentResults
            .filter { originalResult -> emailFilterIntentResults.any { originalResult.activityInfo.packageName == it.activityInfo.packageName } }
            .map {
                createEmailShareIntent(recipients, subject, file, text, secondFile).apply { `package` = it.activityInfo.packageName }
            }
            .toMutableList()
    val finalIntent = Intent.createChooser(targetedIntents.removeAt(0), R.string.choose_email_app.toText())
    finalIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, targetedIntents.toTypedArray())
    startActivity(finalIntent)
}

private fun Activity.createEmailShareIntent(recipients: List<String>, subject: String, file: Uri, text: String? = null, secondFile: Uri? = null): Intent {
    val builder = ShareCompat.IntentBuilder.from(this)
            .setType("message/rfc822")
            .setEmailTo(recipients.toTypedArray())
            .setStream(file)
            .setSubject(subject)
    if (secondFile != null) {
        builder.addStream(secondFile)
    }
    if (text != null) {
        builder.setText(text)
    }
    return builder.intent
}
3 голосов
/ 08 января 2019

От Документы для разработчиков Android :

public void composeEmail(String[] addresses, String subject) {
    Intent intent = new Intent(Intent.ACTION_SENDTO);
    intent.setData(Uri.parse("mailto:")); // only email apps should handle this
    intent.putExtra(Intent.EXTRA_EMAIL, addresses);
    intent.putExtra(Intent.EXTRA_SUBJECT, subject);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}
3 голосов
/ 19 февраля 2017

Если вы хотите, чтобы ваши намерения обрабатывались только приложением электронной почты (а не другими приложениями для обмена текстовыми сообщениями или социальными приложениями), то используйте действие ACTION_SENDTO и включите схему данных mailto: Например:

public void composeEmail(String[] addresses, String subject) {
    Intent intent = new Intent(Intent.ACTION_SENDTO);
    intent.setData(Uri.parse("mailto:")); // only email apps should handle this
    intent.putExtra(Intent.EXTRA_EMAIL, addresses);
    intent.putExtra(Intent.EXTRA_SUBJECT, subject);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}

Я нашел это в https://developer.android.com/guide/components/intents-common.html#Email

2 голосов
/ 03 февраля 2018

Если вы хотите настроить таргетинг на Gmail, вы можете сделать следующее.Обратите внимание, что целью является "ACTION_SENDTO", а не "ACTION_SEND", и дополнительные поля намерения не обязательны для Gmail.

String uriText =
    "mailto:youremail@gmail.com" + 
    "?subject=" + Uri.encode("your subject line here") + 
    "&body=" + Uri.encode("message body here");

Uri uri = Uri.parse(uriText);

Intent sendIntent = new Intent(Intent.ACTION_SENDTO);
sendIntent.setData(uri);
if (sendIntent.resolveActivity(getPackageManager()) != null) {
   startActivity(Intent.createChooser(sendIntent, "Send message")); 
}
...