2010-02-15 3 views
93

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

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

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

+0

У меня такая же проблема. Это не рабочий код. Та же проблема возникает при отправке MMS, есть возможность добавить только один файл. У вас есть некоторые идеи к нему по-другому? – 2010-11-08 16:24:12

ответ

176

Вот код, который нужно создать 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

вы забыли поставить тему и emailText на намерение. в противном случае спасибо за код. –

+5

Правильный тип данных MIME должен быть «text/plain», а не «plain/text»: 'emailIntent.setType (« text/plain »);'.Если вы используете «plain/text», Android заставит использовать GMail в качестве отправителя, но если вы используете «text/plain», он предоставит диалог выбора приложений с Gmail, Facebook, Bluetooth и т. Д. Если вы хотите предложить только почтовые программы вместо этого используйте «text/xml». – Idolon

+4

И если вы измените последнюю строку на 'context.startActivity (emailIntent), флажок« Использовать по умолчанию для этого действия »появится в диалоговом окне выбора приложения, таким образом, пользователь сможет выбрать приложение по умолчанию для отправки электронных писем с помощью несколько вложений. – Idolon

24

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

Это работает для меня.

17

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

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

fileIn.setReadable(true, false) 
+0

Спасибо, сэр, почта не была в состоянии отправлять вложения только по почте. – Josejulio

+0

Спасибо, мужик! Я не мог сделать снимки отправленными без этой строки – konunger

+0

WOW! этот ответ полностью спас мой день. Если кто-то получает «один или несколько файлов, не прикрепленных. Limit 20mb» ошибка из приложения gmail, это исправление решает все. Лучший совет! – belphegor

1

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

Надеется, что это помогает;)

+0

Спасибо за этот код! :) – sha

Смежные вопросы