2011-02-03 46 views
21

Estoy usando Intent.ACTION_SEND para enviar un correo electrónico. Sin embargo, cuando llamo al intent, muestra las opciones para enviar un mensaje, enviar un correo electrónico y también para enviarlo a través de bluetooth. Quiero que solo muestre las opciones para enviar un correo electrónico. ¿Cómo puedo hacer esto?Usando Android Intent.ACTION_SEND para enviar correo electrónico

Respuesta

22
Intent email = new Intent(android.content.Intent.ACTION_SEND); 
        email.setType("application/octet-stream");  

EDIT:
Usted podría tratar de establecer el tipo de "message/rfc822" también.

probar esto ....

+3

WiFi y Bluetooth aún visibles. – efeyc

+0

si tengo que usar el tipo para el tipo de accesorio especial? –

+1

@ N-JOY ¿Por qué "application/octet-stream", y no "message/rfc822"? –

2

Primera solución: tratar de ser más específico en sus parámetros intención. Añadir un destinatario del mensaje, por ejemplo,

emailIntent .putExtra(android.content.Intent.EXTRA_EMAIL, new String[] {"[email protected]"}); 

Segunda solución: utilizar el package manager para encontrar todas las aplicaciones capaces de enviar un mensaje y seleccionar el sólo aquellos que desea utilizar.

+0

Pero no quiero enviar correos electrónicos a uno específico que deba ser seleccionado por el usuario. –

17

@Ganapathy: prueba este código para Gmail pantalla

Intent gmail = new Intent(Intent.ACTION_VIEW); 
       gmail.setClassName("com.google.android.gm","com.google.android.gm.ComposeActivityGmail"); 
       gmail.putExtra(Intent.EXTRA_EMAIL, new String[] { "[email protected]" }); 
       gmail.setData(Uri.parse("[email protected]")); 
       gmail.putExtra(Intent.EXTRA_SUBJECT, "enter something"); 
       gmail.setType("plain/text"); 
       gmail.putExtra(Intent.EXTRA_TEXT, "hi android jack!"); 
       startActivity(gmail); 
+1

+1 ho Gracias amigo probaré este ... –

+1

@Jack Dsilva muy buen ejemplo –

+12

Tenga en cuenta que esto solo funcionará si el dispositivo tiene instalado Gmail. En dispositivos que no son de Google (como, digamos, Kindle Fire, que tiene su propio cliente de correo electrónico) fallará. –

13

Esto te ayudará.

On your button click : 

Intent email = new Intent(Intent.ACTION_SEND); 
email.putExtra(Intent.EXTRA_EMAIL, new String[]{"[email protected]"});   
email.putExtra(Intent.EXTRA_SUBJECT, "subject"); 
email.putExtra(Intent.EXTRA_TEXT, "message"); 
email.setType("message/rfc822"); 
startActivity(Intent.createChooser(email, "Choose an Email client :")); 
+1

Por favor, deje de pedirle a la gente que vote/acepte sus publicaciones. Estoy bastante seguro de que te pedí que detengas esto antes. ¡Gracias! –

+2

este tipo de mensaje incluye aplicaciones como google drive y skype. ¿Hay alguna forma de filtrarlos sin crear un selector? – toobsco42

15

No me atribuyo el mérito de esta respuesta, pero creo que da la mejor respuesta para esta publicación.

Es un concepto erróneo común utilizar text/plain o text/html. Esto desencadenará cualquier aplicación que pueda manejar archivos de texto sin formato o HTML sin contexto, incluidos Google Drive, Dropbox, Evernote y Skype.

usar en su lugar un ACTION_SENDTO, proporcionando la mailto: Uri

intent = new Intent(Intent.ACTION_SENDTO, Uri.parse("mailto:")); 

A continuación, puede proceder usando el selector como se sugiere a través de las otras respuestas.

contestada por @PaulLammertsma aquí Android email chooser

+1

¡Perfecto! Esta debería ser la respuesta aceptada, ya que hace exactamente lo que el OP solicitó. Solo un FYI: si también se usa setType(), esto no funcionará. – mjp66

+0

De acuerdo, ¡se debe aceptar como respuesta! – Anorflame

+0

¡perfecto! Muestra solo las aplicaciones de correo electrónico – Merka

0

mejor código para restringirlo a enviar sólo un correo electrónico. configura este tipo para enviar solo un correo electrónico. i.setType("message/rfc822");

 Intent i = new Intent(Intent.ACTION_SEND); 
     i.setType("message/rfc822"); 
     i.putExtra(Intent.EXTRA_EMAIL , new String[]{"[email protected]"}); 
     i.putExtra(Intent.EXTRA_SUBJECT, "subject of email"); 
     i.putExtra(Intent.EXTRA_TEXT , "body of email"); 
     try { 
      startActivity(Intent.createChooser(i, "Send mail...")); 
     } catch (android.content.ActivityNotFoundException ex) { 
      Toast.makeText(Firstclass.this, "There are no email clients installed.", Toast.LENGTH_SHORT).show(); 
     } 
2

que notar, que esta es una muy vieja pregunta, pero es el primer resultado en la búsqueda de una solución "Enviar correo" y todas las respuestas tienen un problema común:

Usando Intent.ACTION_SEND y intent.setType("message/rfc822") se El resultado es un selector que no solo muestra las aplicaciones de correo, sino todas las aplicaciones que pueden manejar cualquier tipo de soporte de tipo MIME mediante message/rfc822, por ejemplo .mhtml, .mht, .mime. Además de las aplicaciones de correo, podría ser Google Drive, Dropbox, Evernote, etc..

La única solución que encontré para limitar el selector a las aplicaciones de correo solo es usar Intent.ACTION_SENDTO lugar:

Intent intent = new Intent(Intent.ACTION_SENDTO, Uri.fromParts("mailto","[email protected]", null)); 
intent.putExtra(Intent.EXTRA_SUBJECT, "My Mail"); 
intent.putExtra(Intent.EXTRA_TEXT , "My Message"); 

try { 
    startActivity(Intent.createChooser(i, "Send mail...")); 
} catch (android.content.ActivityNotFoundException ex) { 
    Toast.makeText(MainActivity.this, "There are no email clients installed.", Toast.LENGTH_SHORT).show(); 
} 
0

Ésta es una combinación de soluciones Jack Dsilva y Jignesh Mayani:

try 
    { 
     Intent gmailIntent = new Intent(Intent.ACTION_SEND); 
     gmailIntent.setType("text/html"); 

     final PackageManager pm = _activity.getPackageManager(); 
     final List<ResolveInfo> matches = pm.queryIntentActivities(gmailIntent, 0); 
     String gmailActivityClass = null; 

     for (final ResolveInfo info : matches) 
     { 
      if (info.activityInfo.packageName.equals("com.google.android.gm")) 
      { 
       gmailActivityClass = info.activityInfo.name; 

       if (gmailActivityClass != null && !gmailActivityClass.isEmpty()) 
       { 
        break; 
       } 
      } 
     } 

     gmailIntent.setClassName("com.google.android.gm", gmailActivityClass); 
     gmailIntent.putExtra(Intent.EXTRA_EMAIL, new String[] { "[email protected]" }); 
     gmailIntent.putExtra(Intent.EXTRA_SUBJECT, "Subject"); 
     gmailIntent.putExtra(Intent.EXTRA_CC, "[email protected]"); // if necessary 
     gmailIntent.putExtra(Intent.EXTRA_TEXT, "Email message"); 
     gmailIntent.setData(Uri.parse("[email protected]")); 
     this._activity.startActivity(gmailIntent); 
    } 

    catch (Exception e) 
    { 
     Intent i = new Intent(Intent.ACTION_SEND); 
     i.putExtra(Intent.EXTRA_EMAIL, new String[] { "[email protected]" }); 
     i.putExtra(Intent.EXTRA_SUBJECT, "Subject"); 
     i.putExtra(Intent.EXTRA_CC, "[email protected]"); // if necessary 
     i.putExtra(Intent.EXTRA_TEXT, "Email message"); 
     i.setType("plain/text"); 
     this._activity.startActivity(i); 
    } 

Así, en un primer momento se intentará abrir aplicación de Gmail y en caso de que un usuario no lo tiene entonces se implementará el segundo enfoque.

5

Tuve un problema similar con mi aplicación. ¡Recientemente encontré este enlace del sitio oficial de desarrolladores de Android que realmente ayuda! Common Intents: Email

TL; DR:

Intent intent = new Intent(Intent.ACTION_SENDTO); 
intent.setData(Uri.parse("mailto:")); 

Ahora, sólo se mostrará clientes de correo electrónico!

Se puede añadir un asunto y el cuerpo al hacer esto:

intent.putExtra(Intent.EXTRA_SUBJECT, "Subject"); 
intent.putExtra(Intent.EXTRA_TEXT, "Body"); 
3

[Solución para el nivel de API> = 15]

fin he succeded en el envío de correo electrónico con archivos adjuntos a los clientes de correo electrónico sólo. Lo escribo aquí porque me llevó mucho tiempo y puede ser útil para otros.

El problema es:

  • Intent.ACTION_SENDTO toma de datos URI (para que pueda especificar "mailto:" esquema), pero no acepta Intención: EXTRA_STREAM.

  • Intent.ACTION_SEND acepta Intención: EXTRA_STREAM (lo que puede añadir archivo adjunto), pero se necesita único tipo (no URI de datos por lo que no puede especificar "mailto:" esquema).

Así Intent.ACTION_SEND permite al usuario elegir entre varias actividades, incluso si setType ("message/rfc822"), debido a que APP/Actividades pueden gestionar todos los tipos de archivo (típicamente GDrive/Dropbox Apps) y por lo tanto incluso archivos de mensajes de correo electrónico.

La solución está en el método setSelector. Con este método, puede usar Intent.ACTION_SENDTO para seleccionar la actividad, pero luego envíe la intención de Intent.ACTION_SEND.

Aquí mi código de la solución (el archivo adjunto vino de un FileProvider, pero podría ser cualquier archivo):

{ 
    Intent emailSelectorIntent = new Intent(Intent.ACTION_SENDTO); 
    emailSelectorIntent.setData(Uri.parse("mailto:")); 

    final Intent emailIntent = new Intent(Intent.ACTION_SEND); 
    emailIntent.putExtra(Intent.EXTRA_EMAIL, new String[]{"[email protected]"}); 
    emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Subject"); 
    emailIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 
    emailIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION); 
    emailIntent.setSelector(emailSelectorIntent); 

    Uri attachment = FileProvider.getUriForFile(this, "my_fileprovider", myFile); 
    emailIntent.putExtra(Intent.EXTRA_STREAM, attachment); 

    if(emailIntent.resolveActivity(getPackageManager()) != null) 
     startActivity(emailIntent); 
} 
+0

Me salvaste el día. Muchísimas gracias. – MrTy

+0

Genial, este es el único método que realmente funciona sin compromisos. – P1x

0

Esto ahorró mi día. Envía un mensaje de texto compuesto directamente a la aplicación de Gmail:

Intent emailIntent = new Intent(Intent.ACTION_SENDTO, Uri.fromParts(
         "mailto","togmail.com", null)); 
emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Report message"); 
emailIntent.putExtra(Intent.EXTRA_TEXT, edt_msg.getText().toString()); 
startActivity(Intent.createChooser(emailIntent, "Send email...")); 
Cuestiones relacionadas