2012-03-14 4 views
6

W różnych aplikacjach systemu Android używam następującego kodu, aby wyświetlić program do wybierania aplikacji dla poczty e-mail, a po tym, jak użytkownik zdecydował się na jedną z aplikacji, wstaw wstępnie zdefiniowany tekst do Formularz e-mail:E-mailowy zamiar ignorowania podziałów wierszy w ustawionym wcześniej tekście (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")); 

W pętli for, wyjście ciąg obiektów jest łączony z tymczasowego ciąg «contentStr». Po każdym obiekcie powinna istnieć przerwa liniowa ("\ n").

Więc kiedy testuję ten kod na moim telefonie, działa on dobrze i każdy pojedynczy obiekt ma własną linię.

Jednak użytkownicy zgłaszają, że ich aplikacja pocztowa (również w standardzie Androida) umieszcza wszystko w jednym wierszu i ignoruje podziały wiersza.

Czy robię coś złego? Czy mogę po prostu zignorować ten raport o błędzie, ponieważ nie jest to problem, który programista może rozwiązać?

+2

Możesz wypróbować "text/plain' zamiast" plain/text ". Dodatkowo, powinieneś używać 'StringBuilder' zamiast robić całe to konkatenowanie. Sceptycznie podchodzę jednak do tego, że albo pomoże to w twoim problemie. – CommonsWare

+0

Dziękujemy! Ale zobacz moje komentarze poniżej, aby zobaczyć wadę "text/plain". – caw

+1

jak zauważył Marco W., "message/rfc822" jest poprawnym typem mime dla e-maili – njzk2

Odpowiedz

3

2 potencjalnych klientów:

  • próby z \ r i \ n \ r, zamiast po prostu \ n, lub nawet 2 przerwy linii.
  • używać HTML przerwy sformatowana linia (<br>)

Ponadto, coś jest nie tak z kodem tu

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

nie kłaść w intencji, contentStr jest pusta, a zawartość zawiera tylko ostatni obiekt.

To jest lepsze, krótsze i bardziej wydajny sposób:

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

Bardzo dziękuję za alternatywę z 'TextUtils.join()'. Użyłem '\ n' ponieważ jest to dla Linuksa (i innych) i '\ r \ n' jest dla Windowsa (i innych), prawda? Wikipedia sugeruje użycie 'System.getProperty (" line.separator ")' dla linii podziału w Javie.Jest to dobre rozwiązanie? – caw

+0

Myślę, że tak. to powinno dać ci separator linii używany przez system, na którym się znajdujesz, jednak android jest oparty na Linux-ie, więc zawsze powinno być '\ n'. Czy udało ci się odtworzyć problem? – njzk2

0

zastosowanie:

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

Dziękuję! Kiedy używam "text/plain", wybieracz aplikacji pokazuje wszystkie aplikacje, które mogą obsługiwać wiadomości tekstowe (np. SMS, Facebook). Ale kiedy używam mojego starego "zwykłego/tekstu", pojawiają się tylko aplikacje pocztowe.Dlaczego tak jest? Chcę tylko aplikacje pocztowe. – caw

+1

@MarcoW .: 'plain/text' to nie tylko aplikacje pocztowe. Da Ci wszystko, co zainstalował użytkownik, który obsługuje nieprawidłowe typy MIME. Jeśli chcesz ograniczyć przesyłanie e-maili, użyj 'ACTION_SENDTO' i' mailto: '' Uri'. – CommonsWare

+1

Dzięki! "ACTION_SENDTO" nie działa dla mnie. Ale odkryłem, że używanie "message/rfc822" jako typu MIME pomaga. Czy to jest właściwy do wysyłania e-maili? – caw

0

używam coś jak SMS następujące mieć pewność, aby nie dostać/Twitter/Facebook aplikacje tam:

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

I tutaj String msg został wykonany przy użyciu StringBuilder i zawiera \ n dla l ine przerwy. Zasadniczo myślę, że musisz zmienić typ MIME, a zostaniesz ustawiony.

+0

Dziękuję bardzo! StringBuilder to dobra wskazówka. Zobacz mój komentarz do odpowiedzi Jorgesys. Nawet twoja dodatkowa funkcja Uri.parse() nie działa :( – caw

0

Trzeba zastąpić \n do <br/> nawet umieścić EXTRA_TEXT. Jest mój kod:

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/>");); 
Powiązane problemy