Android nhiều tệp đính kèm email bằng Intent


98

Tôi đang làm việc trên chương trình Android để gửi email có tệp đính kèm (tệp hình ảnh, tệp âm thanh, v.v.) bằng Intent with ACTION_SEND. Chương trình đang hoạt động khi email có một tệp đính kèm. Tôi đã từng Intent.putExtra(android.content.Intent.EXTRA_STREAM, uri)đính kèm tệp hình ảnh được chỉ định vào thư và nó đang hoạt động tốt, thư có thể được gửi qua Gmail. Tuy nhiên, khi tôi cố gắng gắn nhiều hình ảnh vào 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.

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 hằng số ý định khác ACTION_SEND_MULTIPLE(có sẵn kể từ API cấp 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 nói rằng nó cung cấp nhiều dữ liệu cho người khác, nó hoạt động như thế nào 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 khai báo ý đị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 giống như trước đây, không có tệp đính kèm nào hiển thị trong email.

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


Tôi có cùng một vấn đề. Nó không phải là mã hoạt động. Vấn đề tương tự cũng 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ề nó theo cách khác không ??

Câu trả lời:


187

Đây là mã bạn cần để tạo emailIntent có chứa nhiều tệp đí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 vì mã.
Bahadır Yağan

5
Đúng kiểu dữ liệu MIME cần được "text / plain" chứ không phải "đồng bằng / text": emailIntent.setType("text/plain");. Nếu bạn sử dụng "văn bản / văn bản", Android sẽ buộc sử dụng GMail làm người gửi, nhưng nếu bạn sử dụng "văn bản / văn bản", 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 chỉ muốn đề xuất 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 context.startActivity(emailIntent);thành hộp kiểm "Sử dụng theo mặc định cho hành động này" sẽ xuất hiện trong hộp thoại trình chọn ứng dụng, do đó người dùng sẽ có thể chọn ứng dụng mặc định để gửi email có nhiều tệp đính kèm.
Idolon

2
Ví dụ này đang tạo cho tôi một "AndroidRuntimeException: Gọi startActivity () từ bên ngoài ngữ cảnh Hoạt động yêu cầu cờ FLAG_ACTIVITY_NEW_TASK. Đây có thực sự là điều bạn muốn?" Tôi đã thử chuyển cả ngữ cảnh Cơ sở và Ứng dụng sang phương thức e-mail này và cả hai đều dẫn đến cùng một lỗi.
ravemir 29/12/12

Điều này đã giải quyết nó cho tôi, nhưng tôi không chắc liệu mình có thoát khỏi một lỗi theo cách kỳ lạ hay không, vì vậy tôi sẽ để lại nhận xét trước ở đây cho bất kỳ ai có bất kỳ ý tưởng nào về nó.
ravemir 29/12/12

29

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

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

theo dõi bởi:

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

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


19

Mặc dù đây là một chủ đề cũ, nhưng vì nó được hiển thị ở đầu trên các tìm kiếm của google, tôi muốn thêm một gợi ý nhỏ để làm cho nó hoàn chỉnh, do đó tôi đã bối rối khi xem 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 một nơi nào đó

fileIn.setReadable(true, false)

Cảm ơn bạn ạ, mail không gửi được file đính kèm mà thôi.
Josejulio

Cảm ơn bạn! Tôi không thể gửi ảnh mà không có dòng này
konunger

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


2

Đối với nhiều tệp đính kèm, sử dụng PutParcelableArrayListExtra(Intent.ExtraStream, uris)trong đó biến uris là một List<IParcelable>(). Đây là 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..."));

Hi vọng điêu nay co ich ;)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.