Cómo abrir el progtwig de correo electrónico a través de Intents (pero solo un progtwig de correo electrónico)

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 más que solo progtwigs de correo electrónico; por ejemplo, en mi teléfono, la aplicación de Facebook, Twitter, reddit es divertido, e incluso el Bluetooth aparece como una alternativa viable para enviar este mensaje. El mensaje es demasiado extenso para algunos de ellos (especialmente Twitter).

¿Hay alguna manera de limitar el selector a solo las aplicaciones que admiten mensajes largos (como el correo electrónico)? ¿O hay una forma de detectar la aplicación que el usuario ha elegido y ajustar el mensaje de forma adecuada?

Cambiar el tipo MIME es la respuesta, esto es lo que hice en mi aplicación para cambiar el mismo comportamiento. intent.setType("message/rfc822");

Gracias a la sugerencia de Pentium10 de buscar cómo funciona Linkify, he encontrado una gran solución a este problema. Básicamente, simplemente crea un enlace “mailto:” y luego llama al Intento 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 en esta solución:

  1. Estoy usando la acción ACTION_VIEW porque es más apropiado para un enlace “mailto:”. No podría proporcionar ninguna acción particular, pero luego podría obtener algunos resultados insatisfactorios (por ejemplo, le preguntará si desea agregar el enlace a sus contactos).

  2. Como este es un enlace de “compartir”, simplemente no incluyo ninguna dirección de correo electrónico, aunque este es un enlace de correo electrónico. Funciona.

  3. No hay un selector involucrado. La razón para esto es permitir que el usuario aproveche los valores predeterminados; si han configurado un progtwig de correo electrónico predeterminado, entonces los llevará directamente a eso, evitando por completo el selector (lo cual me parece bien en mi mente, puede argumentar lo contrario).

Por supuesto, hay mucha delicadeza que estoy dejando de lado (como codificar correctamente el tema / cuerpo), pero deberías ser capaz de resolverlo por tu cuenta.

Esto funcionó para mí

 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[] {"abc@xyz.com"}); 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...")); 

¿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[]{"name@email.com"}); 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 …

Esto es un poco un error tipográfico, ya que necesita cambiar su tipo MIME:

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

Intente cambiar el tipo MIME de simple a mensaje

 intent.setType("text/message"); 

prueba esta opción:

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

Esto funcionó perfectamente para mí. aquí no usa android.content.Intent.ACTION_SEND pero Intent.ACTION_VIEW

 Intent testIntent = new Intent(Intent.ACTION_VIEW); Uri data = Uri.parse("mailto:?subject=" + "blah blah subject" + "&body=" + "blah blah body" + "&to=" + "sendme@me.com"); testIntent.setData(data); startActivity(testIntent);