Android beberapa lampiran email menggunakan Intent

98

Saya telah mengerjakan program Android untuk mengirim email dengan lampiran (file gambar, file audio, dll) menggunakan Intent with ACTION_SEND. Program ini berfungsi jika email memiliki satu lampiran. Saya biasa Intent.putExtra(android.content.Intent.EXTRA_STREAM, uri)melampirkan file gambar yang ditentukan ke email dan berfungsi dengan baik, email dapat dikirim melalui Gmail. Namun, ketika saya mencoba memiliki beberapa gambar yang dilampirkan ke email yang sama dengan menelepon Intent.putExtra(android.content.Intent.EXTRA_STREAM, uri)beberapa kali, gagal berfungsi. Tidak ada lampiran yang muncul di email.

Saya mencari dokumentasi SDK dan kelompok pengguna pemrograman Android tentang lampiran email tetapi tidak dapat menemukan info terkait. Namun, saya telah menemukan bahwa ada konstanta maksud lain ACTION_SEND_MULTIPLE(tersedia sejak API level 4) yang mungkin memenuhi persyaratan saya. Berdasarkan dokumentasi SDK, itu hanya menyatakan bahwa itu mengirimkan banyak data ke orang lain, itu berfungsi seperti ACTION_SEND, kecuali datanya banyak. Tetapi saya masih tidak dapat menemukan penggunaan yang benar untuk perintah ini. Saya mencoba menyatakan niat dengan ACTION_SEND_MULTIPLE, lalu memanggil putExtra(EXTRA_STREAM, uri)beberapa kali untuk melampirkan banyak gambar, tetapi saya mendapatkan hasil keliru yang sama seperti sebelumnya, tidak ada lampiran yang muncul di email.

Adakah yang pernah mencoba ACTION_SEND_MULTIPLEdan membuatnya berfungsi dengan beberapa lampiran email?

yyyy1234
sumber
Saya memiliki masalah yang sama. Ini bukan kode yang berfungsi. Masalah yang sama terjadi saat mengirim MMS, ada kemungkinan untuk menambahkan hanya satu file. Apakah Anda memiliki beberapa ide untuk itu dengan cara lain ??

Jawaban:

187

Berikut adalah kode yang Anda perlukan untuk membuat emailIntent yang berisi banyak lampiran.

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..."));
}
gregm
sumber
2
Anda lupa meletakkan subject dan emailText ke maksud. jika tidak terima kasih untuk kodenya.
Bahadır Yağan
5
Yang benar MIME tipe data harus "text / plain" dan bukan "plain / text": emailIntent.setType("text/plain");. Jika Anda menggunakan "biasa / teks" Android akan memaksa untuk menggunakan Gmail sebagai pengirim, tetapi jika Anda menggunakan "teks / biasa" itu akan menyediakan dialog pemilih aplikasi dengan Gmail, Facebook, Bluetooth dll. Jika Anda hanya ingin mengusulkan program email gunakan "teks / xml" sebagai gantinya.
Idolon
4
Dan jika Anda mengubah baris terakhir ke context.startActivity(emailIntent);kotak centang "Gunakan secara default untuk tindakan ini" akan muncul di dialog pemilih aplikasi, dengan demikian pengguna akan dapat memilih aplikasi default untuk mengirim email dengan banyak lampiran.
Idolon
2
Contoh ini memberi saya "AndroidRuntimeException: Memanggil startActivity () dari luar konteks Activity memerlukan flag FLAG_ACTIVITY_NEW_TASK. Apakah ini yang Anda inginkan?" Saya telah mencoba meneruskan Aplikasi dan konteks dasar ke metode email ini, dan keduanya menghasilkan kesalahan yang sama.
ravemir
Ini menyelesaikannya untuk saya, tetapi saya tidak yakin apakah saya lolos dari kesalahan dengan cara yang aneh, jadi saya akan meninggalkan komentar sebelumnya di sini untuk siapa saja yang tahu tentang itu.
ravemir
29

ACTION_SEND_MULTIPLE harus menjadi aksinya

lalu emailIntent.setType("text/plain");

diikuti oleh:

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

Ini berhasil untuk saya.

santhana
sumber
19

Meskipun ini adalah utas lama, tetapi seperti yang ditampilkan di atas pencarian google saya ingin menambahkan sedikit petunjuk untuk membuatnya lengkap, oleh karena itu saya tersendat di atasnya.

Perlu membuat file terlampir dapat dibaca untuk aktivitas email, jika tidak, file tidak akan dilampirkan. Jadi, Anda harus menelepon ke suatu tempat

fileIn.setReadable(true, false)
thomas
sumber
Terima kasih Pak, surat tidak dapat mengirim lampiran hanya surat.
Josejulio
Terima kasih bung! Saya tidak bisa membuat gambar untuk dikirim tanpa garis ini
konunger
WOW! jawaban ini benar-benar menyelamatkan hari saya. Jika ada yang mendapatkan kesalahan "satu atau lebih file tidak terlampir. Batasi 20mb" dari aplikasi gmail, perbaikan ini menyelesaikan semuanya. Tip terbaik yang pernah ada!
belphegor
18

Di sini saya menemukan contoh yang bagus http://www.blackmoonit.com/2010/02/filebrowser-send-receive-intents/

Anda harus menggunakan

final Intent aIntent = new Intent(Intent.ACTION_SEND_MULTIPLE);
aIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM,theUris);
aIntent.setType(theOverallMIMEtype);
printminion
sumber
2

Untuk beberapa lampiran digunakan di PutParcelableArrayListExtra(Intent.ExtraStream, uris)mana variabel uris adalah. List<IParcelable>(). Berikut contohnya:

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

Semoga ini membantu ;)

Michele Caggiano
sumber