Несколько вложений электронной почты Android с использованием намерения

98

Я работал над программой Android для отправки электронной почты с вложением (файл изображения, аудиофайл и т. Д.), Используя Intent с ACTION_SEND. Программа работает, когда в письме есть одно вложение. Раньше я Intent.putExtra(android.content.Intent.EXTRA_STREAM, uri)прикреплял указанный файл изображения к почте, и он работает нормально, почту можно доставить через Gmail. Однако когда я пытался прикрепить несколько изображений к одному и тому же письму, позвонив Intent.putExtra(android.content.Intent.EXTRA_STREAM, uri)несколько раз, это не сработало. В письме нет вложения.

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

Кто-нибудь пробовал ACTION_SEND_MULTIPLEи работал с несколькими вложениями электронной почты?

гггг1234
источник
У меня та же проблема. Это не рабочий код. Такая же проблема существует при отправке MMS, есть возможность добавить только один файл. У вас есть какие-то идеи по другому поводу ??

Ответы:

187

Вот код, который вам нужен для создания emailIntent, содержащего несколько вложений.

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
вы забыли указать тему и текст сообщения о намерениях. в противном случае спасибо за код.
Bahadır Yaan 09
5
Правильный тип данных MIME должен быть «текст / обычный» , а не «обычный / текст»: emailIntent.setType("text/plain");. Если вы используете "простой / текстовый", Android заставит использовать GMail в качестве отправителя, но если вы используете "текст / обычный", он предоставит диалог выбора приложения с Gmail, Facebook, Bluetooth и т. Д. Если вы хотите предлагать только почтовые программы вместо этого используйте "text / xml".
Idolon
4
И если вы измените последнюю строку context.startActivity(emailIntent);на флажок «Использовать по умолчанию для этого действия» появится в диалоговом окне выбора приложения, таким образом, пользователь сможет выбрать приложение по умолчанию для отправки электронных писем с несколькими вложениями.
Idolon
2
Этот пример вызывает у меня «AndroidRuntimeException: для вызова startActivity () вне контекста Activity требуется флаг FLAG_ACTIVITY_NEW_TASK. Это действительно то, что вы хотите?» Я попытался передать этому методу электронной почты и приложение, и базовый контекст, и оба результата привели к одной и той же ошибке.
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)
Томас
источник
Спасибо, сэр, по почте не удалось отправить вложения только по почте.
Josejulio
Спасибо, мужик! Я не смог бы сделать фотографии для отправки без этой строки
konunger
ВОТ ЭТО ДА! этот ответ полностью спас мне день. Если кто-то получает ошибку «один или несколько файлов не прикреплены. Ограничьте 20 МБ» из приложения Gmail, это исправление решает все. Лучший совет!
belphegor
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..."));

Надеюсь это поможет ;)

Микеле Каджано
источник