Android несколько вложений электронной почты с помощью Intent - PullRequest
97 голосов
/ 15 февраля 2010

Я работаю над программой 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 и работал ли он с несколькими вложениями электронной почты?

Ответы [ 5 ]

184 голосов
/ 21 июля 2010

Вот код, необходимый для создания 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..."));
}
28 голосов
/ 05 января 2011

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 голосов
/ 22 февраля 2013

Хотя это старая ветка, но, как показано сверху в поиске Google, я хочу добавить небольшую подсказку, чтобы завершить ее, поэтому я наткнулся на нее.

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

fileIn.setReadable(true, false)
18 голосов
/ 04 апреля 2010

Здесь я нашел отличный пример http://www.blackmoonit.com/2010/02/filebrowser-send-receive-intents/

вы должны использовать

final Intent aIntent = new Intent(Intent.ACTION_SEND_MULTIPLE);
aIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM,theUris);
aIntent.setType(theOverallMIMEtype);
2 голосов
/ 13 сентября 2016

Для нескольких вложений используйте 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..."));

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

...