2012-03-14 35 views
6

Trong các ứng dụng Android khác nhau, tôi sử dụng mã sau để hiển thị trình chọn ứng dụng cho email và sau khi người dùng quyết định một trong các ứng dụng, hãy chèn văn bản được xác định trước vào hình thức email:Mục đích email bỏ qua ngắt dòng trong văn bản được đặt trước (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")); 

Trong cho vòng lặp, đầu ra chuỗi các đối tượng được nối với chuỗi tạm thời 'contentStr'. Sau mỗi đối tượng, phải có ngắt dòng ("\ n").

Vì vậy, khi tôi kiểm tra mã này trên điện thoại của mình, nó hoạt động tốt và mọi đối tượng đều có dòng riêng.

Nhưng người dùng báo cáo rằng ứng dụng email của họ (tiêu chuẩn Android) đặt mọi thứ vào một dòng và bỏ qua các ngắt dòng.

Vậy tôi có làm gì sai không? Hoặc tôi có thể bỏ qua báo cáo lỗi này vì đây không phải là vấn đề mà nhà phát triển có thể giải quyết?

+2

Bạn có thể thử 'text/plain' thay vì' plain/text'. Ngoài ra, bạn nên sử dụng 'StringBuilder' thay vì làm tất cả việc ghép nối đó. Tôi hoài nghi rằng, hoặc là sẽ giúp đỡ với vấn đề của bạn, mặc dù. – CommonsWare

+0

Cảm ơn bạn! Nhưng xin vui lòng xem ý kiến ​​của tôi dưới đây để xem một bất lợi của "văn bản/đồng bằng". – caw

+1

như Marco W. đã chỉ ra, "message/rfc822" là loại mime chính xác cho các email – njzk2

Trả lời

3

2 dẫn tiềm năng:

  • Hãy thử với \ r hoặc \ n \ r thay vì chỉ đơn giản \ n, hoặc thậm chí 2 ngắt dòng.
  • Sử dụng HTML dòng định dạng phá vỡ (<br>)

Ngoài ra, có cái gì đó sai với mã của bạn ở đây

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

này không đặt bất cứ điều gì trong ý định, contentStr là trống rỗng, và nội dung chỉ chứa đối tượng cuối cùng.

Đây là một, ngắn hơn và hiệu quả hơn phương pháp tốt hơn:

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

Cảm ơn bạn rất nhiều vì sự thay thế bằng 'TextUtils.join()'. Tôi đã sử dụng '\ n' vì nó là dành cho Linux (và những người khác) và '\ r \ n' là dành cho Windows (và những người khác), phải không? Wikipedia đề xuất sử dụng 'System.getProperty (" line.separator ")' cho ngắt dòng trong Java. Đây có phải là giải pháp tốt không? – caw

+0

tôi nghĩ là vậy. điều đó có nghĩa vụ phải cung cấp cho bạn bộ tách dòng được sử dụng bởi hệ thống mà bạn đang sử dụng. Tuy nhiên, android là dựa trên Linux, vì vậy nó luôn phải là '\ n'. Bạn đã có thể tái tạo sự cố chưa? – njzk2

0

sử dụng:

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

Cảm ơn bạn! Khi tôi sử dụng "văn bản/đồng bằng", trình chọn ứng dụng hiển thị tất cả các ứng dụng có thể xử lý tin nhắn văn bản (ví dụ: SMS, Facebook). Nhưng khi tôi sử dụng "đồng bằng/văn bản" cũ của mình, chỉ các ứng dụng email mới hiển thị.Tại sao cái này rất? Tôi chỉ muốn các ứng dụng email. – caw

+1

@MarcoW .: 'plain/text' không chỉ cung cấp cho bạn các ứng dụng email. Nó sẽ cung cấp cho bạn bất cứ điều gì người dùng đã cài đặt xử lý các loại MIME không hợp lệ. Nếu bạn muốn giới hạn mọi thứ để gửi email, hãy sử dụng 'ACTION_SENDTO' và' mailto: '' Uri'. – CommonsWare

+1

Cảm ơn! "ACTION_SENDTO" không hoạt động đối với tôi. Nhưng tôi thấy rằng sử dụng "message/rfc822" như kiểu MIME giúp. Đây có phải là người thích hợp để gửi email không? – caw

0

tôi sử dụng giống như sau phải chắc chắn để không nhận được tin nhắn SMS/ứng dụng Twitter/Facebook trong đó:

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

Và ở đây, String msg được tạo bằng cách sử dụng StringBuilder và chứa \ n cho l nghỉ giải lao. Về cơ bản, tôi nghĩ bạn chỉ cần thay đổi loại MIME của bạn và bạn sẽ được thiết lập.

+0

Cảm ơn bạn rất nhiều! StringBuilder là một gợi ý tốt. Xin vui lòng xem bình luận của tôi để trả lời của Jorgesys. Ngay cả Uri.parse bổ sung của bạn() cũng không hoạt động: ( – caw

0

Bạn cần thay thế \n để <br/> thậm chí bạn đặt EXTRA_TEXT. Có mã của tôi:

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/>");); 
Các vấn đề liên quan