2010-02-15 8 views
93

Tôi đã làm việc trên chương trình Android để gửi email kèm theo tệp đính kèm (tệp hình ảnh, tệp âm thanh, v.v.) sử dụng Intent với ACTION_SEND. Chương trình đang hoạt động khi email có một tệp đính kèm duy nhất. Tôi đã sử dụng Intent.putExtra(android.content.Intent.EXTRA_STREAM, uri) để đính kèm tệp hình ảnh được chỉ định vào thư và hoạt động tốt, thư có thể được gửi qua Gmail. Tuy nhiên, khi tôi cố gắng để có nhiều hình ảnh gắn liền với cùng một thư bằng cách gọi Intent.putExtra(android.content.Intent.EXTRA_STREAM, uri) nhiều lần, nó không hoạt động. Không có tệp đính kèm nào hiển thị trong email.Nhiều tệp đính kèm email trên Android bằng Intent

Tôi đã tìm kiếm tài liệu SDK và nhóm người dùng lập trình Android về tệp đính kèm email nhưng không thể tìm thấy bất kỳ thông tin liên quan nào. Tuy nhiên, tôi đã phát hiện ra rằng có một mục đích khác là hằng số ACTION_SEND_MULTIPLE (có sẵn từ cấp API 4) có thể đáp ứng yêu cầu của tôi. Dựa trên tài liệu SDK, nó chỉ đơn giản tuyên bố rằng nó cung cấp nhiều dữ liệu cho người khác, nó hoạt động như ACTION_SEND, ngoại trừ dữ liệu là nhiều. Nhưng tôi vẫn không thể tìm ra cách sử dụng chính xác cho lệnh này. Tôi đã cố gắng tuyên bố ý định với ACTION_SEND_MULTIPLE, sau đó gọi putExtra(EXTRA_STREAM, uri) nhiều lần để đính kèm nhiều hình ảnh, nhưng tôi đã nhận được kết quả sai lầm giống như trước đây, không có tệp đính kèm nào hiển thị trong email.

Có ai đã thử với ACTION_SEND_MULTIPLE và làm cho nó hoạt động với nhiều tệp đính kèm email không?

+0

Tôi có cùng một vấn đề. Nó không phải là mã làm việc. Vấn đề tương tự tồn tại trong quá trình gửi MMS, có khả năng chỉ thêm một tệp. Bạn có một số ý tưởng với nó theo một cách khác không ?? –

Trả lời

176

Đây là mã bạn cần phải tạo ra một emailIntent có chứa nhiều file đính kèm.

public static void email(Context context, String emailTo, String emailCC, 
    String subject, String emailText, List<String> filePaths) 
{ 
    //need to "send multiple" to get more than one attachment 
    final Intent emailIntent = new Intent(Intent.ACTION_SEND_MULTIPLE); 
    emailIntent.setType("text/plain"); 
    emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, 
     new String[]{emailTo}); 
    emailIntent.putExtra(android.content.Intent.EXTRA_CC, 
     new String[]{emailCC}); 
    emailIntent.putExtra(Intent.EXTRA_SUBJECT, subject); 
    emailIntent.putExtra(Intent.EXTRA_TEXT, emailText); 
    //has to be an ArrayList 
    ArrayList<Uri> uris = new ArrayList<Uri>(); 
    //convert from paths to Android friendly Parcelable Uri's 
    for (String file : filePaths) 
    { 
     File fileIn = new File(file); 
     Uri u = Uri.fromFile(fileIn); 
     uris.add(u); 
    } 
    emailIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris); 
    context.startActivity(Intent.createChooser(emailIntent, "Send mail...")); 
} 
+2

bạn quên đặt chủ đề và emailText vào mục đích. nếu không, cảm ơn mã. –

+5

Loại dữ liệu MIME chính xác phải là "văn bản/đồng bằng" chứ không phải "văn bản/văn bản": 'emailIntent.setType (" văn bản/đồng bằng ");Nếu bạn sử dụng "plain/text" Android sẽ buộc phải sử dụng Gmail làm người gửi nhưng nếu bạn sử dụng "text/plain", nó sẽ cung cấp hộp thoại chọn ứng dụng với Gmail, Facebook, Bluetooth, v.v. Nếu bạn muốn đề xuất chỉ các chương trình thư sử dụng "text/xml" để thay thế. – Idolon

+4

Và nếu bạn thay đổi dòng cuối cùng thành 'context.startActivity (emailIntent); 'hộp kiểm" Sử dụng mặc định cho hành động này "sẽ xuất hiện trong hộp thoại chọn ứng dụng, do đó người dùng sẽ có thể chọn ứng dụng mặc định để gửi email nhiều tệp đính kèm. – Idolon

24

ACTION_SEND_MULTIPLE nên là hành động

và sau đó emailIntent.setType("text/plain");

tiếp theo:

ArrayList<Uri> uris = new ArrayList<Uri>(); 
String[] filePaths = new String[] {"sdcard/sample.png", "sdcard/sample.png"}; 
for (String file : filePaths) 
{ 
    File fileIn = new File(file); 
    Uri u = Uri.fromFile(fileIn); 
    uris.add(u); 
} 
emailIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris); 
startActivity(emailIntent); 

này làm việc cho tôi.

17

Mặc dù đây là một chủ đề cũ, nhưng khi nó được hiển thị trên đầu trang trên tìm kiếm google tôi muốn thêm một gợi ý nhỏ để làm cho nó hoàn thành, do đó tôi stumpled khi nó.

Cần phải làm cho các tệp đính kèm có thể đọc được cho hoạt động thư, nếu không chúng sẽ không được đính kèm. Vì vậy, bạn phải gọi đâu đó

fileIn.setReadable(true, false) 
+0

Cảm ơn bạn, thư không thể gửi tệp đính kèm chỉ thư. – Josejulio

+0

Cảm ơn bạn! Tôi không thể làm cho hình ảnh được gửi mà không có dòng này – konunger

+0

WOW! câu trả lời này hoàn toàn cứu được ngày của tôi. Nếu bất kỳ ai nhận được "một hoặc nhiều tệp không được đính kèm. Giới hạn 20mb" lỗi từ ứng dụng gmail, bản sửa lỗi này sẽ giải quyết mọi thứ. Tip tốt nhất bao giờ hết! – belphegor

1

Đối với nhiều file đính kèm sử dụng PutParcelableArrayListExtra(Intent.ExtraStream, uris) nơi biến URI là một List<IParcelable>(). Dưới đây là một ví dụ:

var email = new Intent(Intent.ActionSendMultiple); 
    email.SetType("text/plain"); 
    email.PutExtra(Intent.ExtraEmail, new string[]{emailTo}); 
    email.PutExtra(Intent.ExtraCc, new string[]{emailCC}); 

    var uris = new List<IParcelable>(); 
    filePaths.ForEach(file=> { 
     var fileIn = new File(file); 
     var uri = Android.Net.Uri.FromFile(fileIn); 
     uris.Add(uri); 
    }); 

    email.PutParcelableArrayListExtra(Intent.ExtraStream, uris); 

    context.StartActivity(Intent.CreateChooser(email, "Send mail...")); 

Hope this helps;)

+0

Cảm ơn một tấn cho mã này! :) – sha