2012-03-14 9 views
6

En varias aplicaciones de Android, utilizo el siguiente código para mostrar un selector de aplicaciones para correo electrónico y, después de que el usuario haya decidido utilizar una de ellas, inserte un texto predefinido en el formulario de correo electrónico:intento de correo electrónico ignorar saltos de línea en texto preestablecido (Android)

final Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND); 
emailIntent.setType("plain/text"); 
emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, new String[] { "[email protected]" }); 
emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, "Sample subject"); 
String contentStr = ""; 
for (Object o : mArrayList) { // mArrayList: ArrayList<Object> 
    content = contentStr+o.toString()+"\n"; 
} 
emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, backupStr); 
startActivity(Intent.createChooser(emailIntent, "Choose application")); 

En el bucle de, cadena de salida de los objetos se concatena con la cadena temporal 'contentStr'. Después de cada objeto, debería haber un salto de línea ("\ n").

Así que cuando pruebo este código en mi teléfono, funciona bien y cada objeto tiene su propia línea.

Pero los usuarios informan que su aplicación de correo electrónico (estándar Android también) pone todo en una línea e ignora los saltos de línea.

Entonces, ¿estoy haciendo algo mal? ¿O puedo simplemente ignorar este informe de error ya que no es un problema que el desarrollador pueda resolver?

+2

Puede intentar 'text/plain' en lugar de' plain/text'. Además, deberías estar usando 'StringBuilder' en lugar de hacer toda esa concatenación. Sin embargo, soy escéptico de que cualquiera ayude con tu problema. – CommonsWare

+0

¡Gracias! Pero por favor vea mis comentarios a continuación para ver una desventaja de "text/plain". – caw

+1

como señaló Marco W., "message/rfc822" es el tipo de mime correcto para los correos electrónicos – njzk2

Respuesta

3

2 clientes potenciales:

  • intenta incluso con 2 saltos de línea \ n \ r \ r o en lugar de simplemente \ n o.
  • usar HTML saltos de línea formateada (<br>)

Además, hay algo mal con su código aquí

String contentStr = ""; 
for (Object o : mArrayList) { // mArrayList: ArrayList<Object> 
    content = contentStr+o.toString()+"\n"; 
} 
emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, backupStr); 

Esto no pone nada en el intento, contentStr está vacía, y el contenido solo contiene el último objeto.

Este es un método mejor, más corto y más eficiente:

contentStr = TextUtils.join("\n", mArrayList); 
+3

Muchas gracias por la alternativa con 'TextUtils.join()'. Utilicé '\ n' porque esto es para Linux (y otros) y '\ r \ n' es para Windows (y otros), ¿no? Wikipedia sugiere usar 'System.getProperty (" line.separator ")' para los saltos de línea en Java. ¿Es esta una buena solución? – caw

+0

Creo que sí. se suponía que eso le proporcionaría el separador de línea utilizado por el sistema en el que se encuentra. Sin embargo, Android está basado en Linux, por lo que siempre debe ser '\ n'. ¿Ha sido capaz de reproducir el problema? – njzk2

0

uso:

emailIntent.setType("text/plain"); 

ACTION_SEND

final Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND); 
emailIntent.setType("text/plain"); 
emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, new String[] { "[email protected]" }); 
emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, "Sample subject"); 
String contentStr = ""; 
for (Object o : mArrayList) { // mArrayList: ArrayList<Object> 
    content = contentStr+o.toString()+"\n"; 
} 
emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, backupStr); 
startActivity(Intent.createChooser(emailIntent, "Choose application")); 
+0

¡Gracias! Cuando uso "text/plain", el selector de aplicaciones muestra todas las aplicaciones que pueden manejar mensajes de texto (por ejemplo, SMS, Facebook). Pero cuando uso mi antiguo "texto simple", solo aparecen las aplicaciones de correo electrónico.¿Por qué esto es tan? Solo quiero las aplicaciones de correo electrónico. – caw

+1

@MarcoW .: 'plain/text' no solo le proporciona aplicaciones de correo electrónico. Le dará todo lo que el usuario haya instalado que maneje tipos MIME inválidos. Si desea limitar las cosas a un correo electrónico, use 'ACTION_SENDTO' y' mailto: '' Uri'. – CommonsWare

+1

Gracias! "ACTION_SENDTO" no funciona para mí. Pero descubrí que usar "message/rfc822" como el tipo MIME ayuda. ¿Es este el correcto para enviar correos electrónicos? – caw

0

utilizo algo así como el SMS siguiente para asegurarse de que no llega/aplicaciones de Twitter/Facebook ahí:

Intent emailIntent = new Intent(Intent.ACTION_SEND, Uri.parse("mailto:[email protected]")); 
       emailIntent.setType("text/plain"); 
       emailIntent.putExtra(Intent.EXTRA_EMAIL, new String[] {"[email protected]"}); 
       emailIntent.putExtra(Intent.EXTRA_TEXT, msg); 
       emailIntent.putExtra(Intent.EXTRA_SUBJECT, "This is my Error Report"); 

Y aquí el String msg se realizó utilizando un StringBuilder y contiene \ n para l ine rompe. Básicamente, creo que solo tienes que cambiar tu tipo MIME y estarás listo.

+0

¡Muchas gracias! StringBuilder es una buena pista. Por favor, mira mi comentario a la respuesta de Jorgesys. Incluso su Uri.parse() adicional no funciona :( – caw

0

Es necesario sustituir \n a <br/> te metan EXTRA_TEXT. Está mi código:

final Intent intent = new Intent(Intent.ACTION_SEND_MULTIPLE); 
intent.setType("message/rfc822"); 
intent.putExtra(Intent.EXTRA_EMAIL, "[email protected]"); 
intent.putExtra(Intent.EXTRA_SUBJECT, "subject"); 
intent.putExtra(Intent.EXTRA_TEXT, "This\nis\na\ntest!".replace("\n", "<br/>");); 
Cuestiones relacionadas