683 Stimmen

Intention zum Senden einer E-Mail

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

Der obige Code öffnet ein Dialogfeld mit den folgenden Anwendungen: Bluetooth, Google Docs, Yahoo Mail, Gmail, Orkut, Skype usw.

Eigentlich möchte ich diese Listenoptionen filtern. Ich möchte nur E-Mail-bezogene Anwendungen anzeigen, z. B. Gmail und Yahoo Mail. Wie kann ich das tun?

Ich habe ein solches Beispiel in der Anwendung "Android Market" gesehen.

  1. Öffnen Sie die Android Market-App
  2. Öffnen Sie eine Anwendung, bei der der Entwickler seine E-Mail-Adresse angegeben hat. (Wenn Sie eine solche Anwendung nicht finden können, öffnen Sie einfach meine Anwendung: market://details?id=com.becomputer06.vehicle.diary.free, ODER suchen Sie nach 'Vehicle Diary')
  3. Scrollen Sie nach unten zu 'DEVELOPER'.
  4. Klicken Sie auf 'E-Mail senden'.

Der Dialog zeigt nur E-Mail-Apps an, z. B. Gmail, Yahoo Mail usw. Bluetooth, Orkut, etc. werden nicht angezeigt. Welcher Code erzeugt einen solchen Dialog?

9voto

David Vávra Punkte 17238

Die meisten dieser Antworten funktionieren nur für den einfachen Fall, dass Sie nicht senden Anhang . In meinem Fall muss ich manchmal einen Anhang (ACTION_SEND) oder zwei Anhänge (ACTION_SEND_MULTIPLE) senden.

Also habe ich die besten Ansätze aus diesem Thread genommen und sie kombiniert. Es verwendet die Support-Bibliothek ShareCompat.IntentBuilder aber ich zeige nur Anwendungen, die mit der ACTION_SENDTO mit "mailto:" uri übereinstimmen. Auf diese Weise erhalte ich nur eine Liste von E-Mail-Anwendungen mit Anhangsunterstützung:

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
}

6voto

Mughil Punkte 645

In Kotlin falls jemand interessiert ist

val emailArrray:Array<String> = arrayOf("travelagentsupport@kkk.com")
val intent = Intent(Intent.ACTION_SENDTO)
intent.data = Uri.parse("mailto:") // only email apps should handle this
intent.putExtra(Intent.EXTRA_EMAIL, emailArrray)
intent.putExtra(Intent.EXTRA_SUBJECT, "Inquire about travel agent")
if (intent.resolveActivity(getPackageManager()) != null) {
    startActivity(intent);
}

5voto

Lamine Slimany Punkte 51

Wenn Sie sicherstellen möchten, dass Ihre Absicht nur von einer E-Mail-Anwendung (und nicht von anderen Textnachrichten- oder sozialen Anwendungen) bearbeitet wird, dann verwenden Sie die ACTION_SENDTO Aktion und fügen Sie das Datenschema "mailto:" ein. Zum Beispiel:

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

Ich fand dies in https://developer.Android.com/guide/components/intents-common.html#Email

5voto

Suyog Gunjal Punkte 287

Folgender Code hat bei mir funktioniert!

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

5voto

EpicPandaForce Punkte 75417

Das funktioniert bei mir einwandfrei:

    Intent intent = new Intent(Intent.ACTION_VIEW);
    intent.setData(Uri.parse("mailto:" + address));
    startActivity(Intent.createChooser(intent, "E-mail"));

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X