Intent kullanarak Android çoklu e-posta ekleri


98

Intent'i kullanarak bir ek (resim dosyası, ses dosyası vb.) İçeren e-posta göndermek için Android programı üzerinde çalışıyorum ACTION_SEND. Program, e-postanın tek bir eki olduğunda çalışıyor. Kullandığım Intent.putExtra(android.content.Intent.EXTRA_STREAM, uri)postaya belirlenen görüntü dosyası eklemek ve bir sorun çıkmadı, posta Gmail üzerinden teslim edilebilir. Ancak, birden Intent.putExtra(android.content.Intent.EXTRA_STREAM, uri)çok kez arayarak aynı postaya birden çok resim eklemeyi denediğimde çalışamadı. E-postada eklerin hiçbiri görünmüyor.

E-posta eki hakkında SDK belgelerini ve Android programlama kullanıcı grubunu aradım ancak ilgili herhangi bir bilgi bulamadım. Ancak, ACTION_SEND_MULTIPLEgereksinimlerimi karşılayabilecek başka bir niyet sabiti (API seviyesi 4'ten beri mevcuttur) olduğunu keşfettim . SDK belgelerine dayanarak, yalnızca birden çok veriyi başka birine teslim ettiğini belirtir, verilerin birden çok olması ACTION_SENDdışında olduğu gibi çalışır . Ama yine de bu komutun doğru kullanımını bulamadım. İle niyet beyan etmeye çalıştım ACTION_SEND_MULTIPLE, ardından putExtra(EXTRA_STREAM, uri)birden fazla görüntü eklemek için birçok kez aradım, ancak daha önce olduğu gibi aynı hatalı sonucu aldım, e-postada hiçbir ek görünmüyor.

Herkes denedi ACTION_SEND_MULTIPLEve birden fazla e-posta eki ile çalıştı mı?


Bende de aynı sorun var. Çalışma kodu değil. Aynı sorun MMS gönderimi sırasında da ortaya çıkıyor, sadece bir dosya ekleme imkanı var. Bunun için başka bir şekilde fikirleriniz var mı?

Yanıtlar:


187

Birden çok ek içeren bir emailIntent oluşturmak için ihtiyacınız olan kod burada.

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
konuyu ve emailText'i amaca eklemeyi unuttunuz. aksi takdirde kod için teşekkürler.
Bahadır Yağan

5
Doğru MIME veri türü "metin / düz" ve "düz / metin" olmalıdır: emailIntent.setType("text/plain");. "Düz / metin" kullanırsanız Android, gönderici olarak GMail'i kullanmaya zorlar, ancak "metin / düz" kullanırsanız Gmail, Facebook, Bluetooth vb. İle uygulama seçici iletişim kutusu sağlar. Yalnızca posta programları önermek istiyorsanız bunun yerine "metin / xml" kullanın.
Idolon

4
Ve son satırı context.startActivity(emailIntent);"Bu eylem için varsayılan olarak kullan" onay kutusuna değiştirirseniz, uygulama seçici iletişim kutusunda görünür, böylece kullanıcı, birden çok ek içeren e-postaları göndermek için varsayılan uygulamayı seçebilir.
Idolon

2
Bu örnek bana bir "AndroidRuntimeException: Bir Activity bağlamının dışından startActivity () 'yi çağırmak FLAG_ACTIVITY_NEW_TASK bayrağını gerektirir. İstediğiniz gerçekten bu mu?" Bu e-posta yöntemine hem Uygulama hem de temel bağlamı aktarmayı denedim ve her ikisi de aynı hatayla sonuçlandı.
ravemir

Bu benim için sorunu çözdü, ancak bir hatadan garip bir şekilde kaçtığımdan emin değilim, bu yüzden bu konuda herhangi bir fikri olan herkes için önceki yorumu burada bırakacağım.
ravemir

29

ACTION_SEND_MULTIPLE eylem olmalı

ve sonra emailIntent.setType("text/plain");

bunu takiben:

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

Bu benim için çalışıyor.


19

Bu eski bir konu olmasına rağmen, google aramalarında üstte gösterildiği gibi, onu tamamlamak için küçük bir ipucu eklemek istiyorum, bu yüzden üzerine tökezledim.

Ekli dosyaların posta etkinliği için okunabilir hale getirilmesi gerekir, aksi takdirde eklenmezler. Yani bir yeri aramalısın

fileIn.setReadable(true, false)

Teşekkür ederim efendim, posta ekleri sadece postayı gönderemedi.
Josejulio

Teşekkür ederim dostum! Bu satır olmadan resimleri
gönderemedim

VAOV! bu cevap günümü tamamen kurtardı. Herhangi biri Gmail uygulamasından "bir veya daha fazla dosya eklenmedi. Sınır 20mb" hatası alırsa, bu düzeltme her şeyi çözer. Şimdiye kadarki en iyi ipucu!
belphegor


2

Birden çok eklenti için PutParcelableArrayListExtra(Intent.ExtraStream, uris)uris değişkeninin olduğu yeri kullanın List<IParcelable>(). İşte bir örnek:

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

Bu yardımcı olur umarım ;)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.