2010-07-22 16 views
65

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 de configurar esto:Cómo abrir el programa de correo electrónico a través de Intents (pero solo un programa de correo electrónico)

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 el ACTION_SEND es aceptada por más que programas de correo electrónico - por ejemplo, en mi teléfono la aplicación de Facebook, Twitter, Reddit es divertido, y incluso Bluetooth aparece como alternativas viables 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?

+2

Me pregunto cómo la clase Linkify decide qué abrir para los enlaces de mailto. Tal vez verifique el código fuente de Linkify y publique sus hallazgos. – Pentium10

+0

Buena llamada: lo verificaré y le diré si encuentro algo de interés. –

+0

Gracias otra vez Pentium10, buena sugerencia sobre cómo Linkify hace las cosas. –

Respuesta

77

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

+1

No asumiría que cada programa de correo electrónico admite ese tipo MIME. – CommonsWare

+2

En mi dispositivo, enumera Gmail, pero también "Drive" y "AndFTP" – auval

+9

Uso el nuevo Intento (Intención.ACTION_SENDTO, Uri.parse ("mailto:")); –

4

¿Has probado la inclusión del 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...")); 

que pueden restringir la lista de aplicaciones disponibles receptor ...

+2

He intentado esto, no ayuda. Los extras no se utilizan para filtrar las aplicaciones en un selector. –

+0

Creo que la única otra solución sería lanzar un programa de correo específico pasando un String con su ruta completa de clase/paquete. Esto restringiría a los usuarios a una sola aplicación de correo, pero evitaría que otros tipos de aplicaciones (como Twitter) sean opciones ... – idolize

+1

No me gusta esa idea porque la mayoría de los usuarios tendrán dos aplicaciones de correo predeterminadas para comenzar (la aplicación de correo estándar y Gmail), y no quiero adivinar cuál usarán. –

79

Gracias a la sugerencia de buscar cómo funciona Linkify de Pentium10, he encontrado una gran solución a este problema. Básicamente, que acaba de crear un "mailto:" vínculo, y luego llama a la Intención apropiado para ese .:

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 a esta solución:

  1. estoy usando la acción ACTION_VIEW porque es más apropiada 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. Dado que este es un enlace "compartir", simplemente no incluyo ninguna dirección de correo electrónico, aunque este es un enlace de correo electrónico. Funciona.

  3. No hay elección del selector. La razón para 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, evitando por completo el selector (lo cual me parece bien en mi mente, puede argumentar lo contrario).

Por supuesto que hay una gran cantidad de finura que estoy dejando de lado (como la codificación propiamente objeto/cuerpo), pero debe ser capaz de darse cuenta de eso por su cuenta.

+0

De toda la solución alrededor funcionó para mí Gracias amigo :) – Bora

+2

este es el mejor método porque no muestra Snapchat, Telegram y otras aplicaciones que permiten el envío de texto – WuerfelDev

+3

En caso de que alguien necesite, especifique receptor con "& para " – Umarov

0

intente cambiar el tipo MIME del mensaje claro para

intent.setType("text/message"); 
1

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

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

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[] {"[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...")); 
+1

Funciona bien. Me gusta el método createChooser ... gracias .. – jheneghan

+1

Funcionó como un amuleto. Tenga en cuenta especialmente que el correo_extra debe estar en el conjunto de cadenas, o el al: va a estar vacío ... – Nilesh

0

probar esta opción:

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