Quiero configurar una parte de mi aplicación que permita a los usuarios enviar un correo electrónico rápido a otro usuario. No es muy difícil configurar esto:
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);
Sin embargo, el problema es que ACTION_SEND es aceptado por algo más que programas de correo electrónico; por ejemplo, en mi teléfono la aplicación de Facebook, Twitter, reddit es divertida e incluso Bluetooth aparece como alternativas viables para enviar este mensaje. El mensaje es demasiado largo para algunos de ellos (especialmente Twitter).
¿Existe alguna forma de limitar el selector a solo aplicaciones que admiten mensajes largos (como el correo electrónico)? ¿O hay alguna forma de detectar la aplicación que el usuario ha elegido y ajustar el mensaje de forma adecuada?
Respuestas:
Cambiar el tipo de MIME es la respuesta, esto es lo que hice en mi aplicación para cambiar el mismo comportamiento. solía
intent.setType("message/rfc822");
fuente
Gracias a la sugerencia de Pentium10 de buscar cómo funciona Linkify, he encontrado una gran solución a este problema. Básicamente, solo crea un enlace "mailto:" y luego llama al Intent apropiado para eso:
Intent intent = new Intent(Intent.ACTION_VIEW); Uri data = Uri.parse("mailto:?subject=" + subject + "&body=" + body); intent.setData(data); startActivity(intent);
Hay algunos aspectos interesantes de esta solución:
Estoy usando la acción ACTION_VIEW porque es más apropiada para un enlace "mailto:". No podría proporcionar ninguna acción en particular, pero luego podría obtener algunos resultados insatisfactorios (por ejemplo, le preguntará si desea agregar el enlace a sus contactos).
Dado que este es un enlace para "compartir", simplemente no incluyo ninguna dirección de correo electrónico, aunque este es un enlace mailto. Funciona.
No hay ningún selector involucrado. La razón de esto es permitir que el usuario aproveche los valores predeterminados; si han configurado un programa de correo electrónico predeterminado, entonces los llevará directamente a eso, sin pasar por el selector (lo que me parece bueno, puede argumentar lo contrario).
Por supuesto, hay mucha delicadeza que estoy dejando de lado (como codificar correctamente el sujeto / cuerpo), pero deberías poder resolver eso por tu cuenta.
fuente
Esto funcionó para mi
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..."));
fuente
¿Has intentado incluir el
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..."));
Eso puede restringir la lista de aplicaciones de receptor disponibles ...
fuente
Prueba este
Intent intent = new Intent("android.intent.action.SENDTO", Uri.fromParts("mailto", "[email protected]", null)); intent.putExtra("android.intent.extra.SUBJECT", "Enter Subject Here"); startActivity(Intent.createChooser(intent, "Select an email client"));
fuente
Ninguna de las soluciones funcionó para mí. Gracias al desarrollador de código abierto, cketti por compartir su solución concisa y ordenada.
String mailto = "mailto:[email protected]" + "?cc=" + "[email protected]" + "&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 }
Y este es el enlace a su esencia.
fuente
Intente cambiar el tipo MIME de simple a mensaje
intent.setType("text/message");
fuente
Esto es un error tipográfico, ya que necesita cambiar su tipo MIME:
intent.setType("plain/text"); //Instead of "text/plain"
fuente
plain/text
no es un tipo MIME válido. ¿Tiene una referencia para esto?prueba esta opción:
Intent intentEmail = new Intent(Intent.ACTION_SEND); intentEmail.setType("message/rfc822");
fuente
ENVIAR A CLIENTES DE CORREO ELECTRÓNICO ÚNICAMENTE, CON MÚLTIPLES ADJUNTOS
Hay muchas soluciones, pero todas funcionan parcialmente.
mailto filtra correctamente las aplicaciones de correo electrónico, pero tiene la incapacidad de no enviar secuencias / archivos.
message / rfc822 abre un infierno de aplicaciones junto con clientes de correo electrónico
entonces, la solución para esto es usar ambos.
private void share() { Intent queryIntent = new Intent(Intent.ACTION_SENDTO, Uri.parse("mailto:")); Intent dataIntent = getDataIntent(); Intent targetIntent = getSelectiveIntentChooser(context, queryIntent, dataIntent); startActivityForResult(targetIntent); }
Cree la intención de datos requerida que se completa con los datos necesarios para compartir
private Intent getDataIntent() { Intent dataIntent = buildIntent(Intent.ACTION_SEND, null, "message/rfc822", null); // Set subject dataIntent.putExtra(Intent.EXTRA_SUBJECT, title); //Set receipient list. dataIntent.putExtra(Intent.EXTRA_EMAIL, toRecipients); dataIntent.putExtra(Intent.EXTRA_CC, ccRecipients); dataIntent.putExtra(Intent.EXTRA_BCC, bccRecipients); if (hasAttachments()) { ArrayList<Uri> uris = getAttachmentUriList(); if (uris.size() > 1) { intent.setAction(Intent.ACTION_SEND_MULTIPLE); dataIntent.putExtra(Intent.EXTRA_STREAM, uris); } else { dataIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris.get(0)); } } return dataIntent; } protected ArrayList<Uri> getAttachmentUriList() { ArrayList<Uri> uris = new ArrayList(); for (AttachmentInfo eachAttachment : attachments) { uris.add(eachAttachment.uri); } return uris; }
Clase de utilidad para filtrar las intenciones requeridas según la intención de la consulta
// Placed in IntentUtil.java public static Intent getSelectiveIntentChooser(Context context, Intent queryIntent, Intent dataIntent) { List<ResolveInfo> appList = context.getPackageManager().queryIntentActivities(queryIntent, PackageManager.MATCH_DEFAULT_ONLY); Intent finalIntent = null; if (!appList.isEmpty()) { List<android.content.Intent> targetedIntents = new ArrayList<android.content.Intent>(); for (ResolveInfo resolveInfo : appList) { String packageName = resolveInfo.activityInfo != null ? resolveInfo.activityInfo.packageName : null; Intent allowedIntent = new Intent(dataIntent); allowedIntent.setComponent(new ComponentName(packageName, resolveInfo.activityInfo.name)); allowedIntent.setPackage(packageName); targetedIntents.add(allowedIntent); } if (!targetedIntents.isEmpty()) { //Share Intent Intent startIntent = targetedIntents.remove(0); Intent chooserIntent = android.content.Intent.createChooser(startIntent, ""); chooserIntent.putExtra(android.content.Intent.EXTRA_INITIAL_INTENTS, targetedIntents.toArray(new Parcelable[]{})); chooserIntent.addFlags(android.content.Intent.FLAG_GRANT_READ_URI_PERMISSION); finalIntent = chooserIntent; } } if (finalIntent == null) //As a fallback, we are using the sent data intent { finalIntent = dataIntent; } return finalIntent; }
fuente