Android-додатки з кількома електронними адресами за допомогою Intent


98

Я працював над програмою Android, щоб надсилати електронний лист із вкладенням (файл зображення, аудіофайл тощо) за допомогою Intent with ACTION_SEND. Програма працює, коли електронна пошта має єдине вкладення. Я використовував Intent.putExtra(android.content.Intent.EXTRA_STREAM, uri)для прикріплення призначеного файлу зображення до пошти, і він працює нормально, пошту можна доставити через Gmail. Однак, коли я намагався декілька зображень приєднати до однієї пошти, зателефонувавши Intent.putExtra(android.content.Intent.EXTRA_STREAM, uri)кілька разів, це не вдалося. Жодне вкладення не відображається в електронному листі.

Я шукав документацію SDK та групу користувачів програми програмування Android щодо вкладення електронної пошти, але не можу знайти жодної пов'язаної інформації. Однак я виявив, що існує інша константа намірів ACTION_SEND_MULTIPLE(доступна з 4 рівня API), яка може відповідати моїй вимозі. На основі документації SDK він просто констатує, що він доставляє кілька даних комусь іншим, він працює як ACTION_SEND, за винятком того, що дані множинні. Але я все ще не міг з’ясувати правильне використання цієї команди. Я намагався оголосити про намір ACTION_SEND_MULTIPLE, потім зателефонував putExtra(EXTRA_STREAM, uri)кілька разів, щоб долучити кілька зображень, але я отримав такий самий помилковий результат, як і раніше, жодне з вкладених файлів не з’являється в електронній пошті.

Хтось намагався ACTION_SEND_MULTIPLEі чи працював він з кількома вкладеннями електронної пошти?


У мене така ж проблема. Це не працює код. Така ж проблема існує під час надсилання MMS, є можливість додати лише один файл. Чи є у вас якісь ідеї до нього іншим способом ??

Відповіді:


187

Ось код, необхідний для створення електронної пошти, яка містить кілька вкладених файлів.

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
ви забули поставити тему та emailText до наміру. інакше дякую за код.
Bahadır Yağan

5
Правильний тип даних MIME повинен бути «текст / звичайний» , а не «звичайний / текст»: emailIntent.setType("text/plain");. Якщо ви використовуєте "звичайний / текстовий", Android змусить використовувати GMail в якості відправника, але якщо ви використовуєте "текст / звичайний", він надасть діалог вибору програми з Gmail, Facebook, Bluetooth тощо. Якщо ви хочете запропонувати лише поштові програми використовуйте замість "text / xml".
Ідолон

4
І якщо ви зміните останній рядок, щоб context.startActivity(emailIntent);у діалоговому вікні вибору програми з'явився прапорець "Використовувати за замовчуванням для цієї дії", таким чином користувач зможе вибрати програму за замовчуванням для надсилання електронних листів із декількома вкладеннями.
Ідолон

2
Цей приклад містить мені "AndroidRuntimeException: для виклику startActivity () поза контекстом діяльності потрібен прапор FLAG_ACTIVITY_NEW_TASK. Це дійсно те, що ви хочете?" Я намагався передати і метод Application, і базовий контекст до цього методу електронної пошти, і обидва призводять до однієї помилки.
ravemir

Це вирішило це для мене, але я не впевнений, чи я уникаю помилки дивним чином, тому я залишу тут попередній коментар для всіх, хто має про це уявлення.
ravemir

29

ACTION_SEND_MULTIPLE повинна бути дія

і потім emailIntent.setType("text/plain");

далі:

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

Це працює для мене.


19

Хоча це стара тема, але, як це показано зверху в пошуку Google, я хочу додати невелику підказку, щоб зробити її повною, отже, я натрапив на неї.

Необхідно зробити додані файли читатими для поштової діяльності, інакше вони не будуть прикріплені. Тож треба кудись дзвонити

fileIn.setReadable(true, false)

Дякую, сер, пошта не змогла надсилати вкладення лише поштою.
Жозехуліо

Дякую тобі, чоловіче! Я не зміг зробити так, щоб фотографії були надіслані без цього рядка
konunger

ОЦЕ ТАК! ця відповідь повністю врятувала мені день. Якщо хтось отримує помилку "один або декілька файлів. Додаток з обмеженням 20 Мб" від програми gmail, це виправлення вирішує все. Найкраща порада коли-небудь!
Белфегор


2

Для кількох вкладень використовуйте, PutParcelableArrayListExtra(Intent.ExtraStream, uris)де змінна uris є List<IParcelable>(). ось ось приклад:

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

Сподіваюся, це допомагає;)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.