2012-03-14 6 views
6

In varie applicazioni Android, utilizzo il seguente codice per mostrare un selettore di applicazioni per e-mail e, dopo che l'utente ha deciso per una delle app, inserire un testo predefinito in il modulo email:E-mail che ignora interruzioni di riga nel testo predefinito (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")); 

Nel ciclo for, uscita stringa degli oggetti è concatenato con la stringa temporanea 'contentStr'. Dopo ogni oggetto, dovrebbe esserci un'interruzione di riga ("\ n").

Così quando provo questo codice sul mio telefono, funziona perfettamente e ogni singolo oggetto ha una propria linea.

Ma gli utenti segnalano che la loro applicazione di posta elettronica (anche lo standard di Android) mette tutto in una riga e ignora le interruzioni di riga.

Quindi sto facendo qualcosa di sbagliato? O posso semplicemente ignorare questo bug report in quanto non è un problema che lo sviluppatore può risolvere?

+2

Si potrebbe provare 'text/plain' invece di' plain/text'. Inoltre, dovresti usare 'StringBuilder' invece di fare tutta quella concatenazione. Sono scettico sul fatto che, comunque, sia d'aiuto per il tuo problema. – CommonsWare

+0

Grazie! Ma per favore vedi i miei commenti qui sotto per vedere uno svantaggio di "text/plain". – caw

+1

come ha sottolineato Marco W., "message/rfc822" è il tipo mime corretto per le email – njzk2

risposta

3

2 potenziali contatti:

  • provare con \ r \ n \ r invece di \ n, o anche 2 interruzioni di riga.
  • Usa HTML interruzioni di riga formattato (<br>)

Inoltre, c'è qualcosa di sbagliato con il codice qui

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

Questo non mette nulla in l'intento, contentStr è vuoto, e il contenuto contiene solo l'ultimo oggetto.

Si tratta di un metodo migliore, più breve e più efficiente:

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

Grazie mille per l'alternativa con 'TextUtils.join()'. Ho usato '\ n' perché questo è per Linux (e altri) e '\ r \ n' è per Windows (e altri), non è vero? Wikipedia suggerisce di usare 'System.getProperty (" line.separator ")' per le interruzioni di riga in Java.È una buona soluzione? – caw

+0

penso che lo sia. che dovrebbe fornire il separatore di riga usato dal sistema in cui ti trovi. Tuttavia, Android è basato su Linux, quindi dovrebbe sempre essere \ n '. Sei riuscito a riprodurre il 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

Grazie! Quando utilizzo "text/plain", il selettore di applicazioni mostra tutte le app in grado di gestire messaggi di testo (ad esempio SMS, Facebook). Ma quando uso il mio vecchio "plain/text", vengono visualizzate solo le applicazioni di posta elettronica.Perché è così? Voglio solo le applicazioni di posta elettronica. – caw

+1

@MarcoW .: 'plain/text' non ti dà solo applicazioni di posta elettronica. Vi fornirà tutto ciò che l'utente ha installato che gestisce tipi MIME non validi. Se vuoi limitare le cose alla posta elettronica, usa 'ACTION_SENDTO' e un' mailto: '' Uri'. – CommonsWare

+1

Grazie! "ACTION_SENDTO" non funziona per me. Ma ho trovato che usare "message/rfc822" come il tipo MIME aiuta. È giusto per l'invio di email? – caw

0

io uso qualcosa come l'SMS seguente per essere sicuri di non avere/Twitter/Facebook apps in là:

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"); 

E qui il String msg è stato creato utilizzando un StringBuilder e contiene \ n per l pause Fondamentalmente, penso che devi solo cambiare il tuo tipo MIME e sarai impostato.

+0

Grazie mille! StringBuilder è un buon suggerimento. Per favore, vedi il mio commento alla risposta di Jorgesys. Anche il tuo Uri.parse() aggiuntivo non funziona :( – caw

0

È necessario sostituire \n a <br/> nemmeno si mette EXTRA_TEXT. C'è il mio codice:

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/>");); 
Problemi correlati