Android с несколькими приложениями электронной почты с использованием Intent
Я работал над программой 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
и получил ли он работу с несколькими вложениями электронной почты?
Ответы
Ответ 1
Вот код, необходимый для создания 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
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);
Это работает для меня.
Ответ 3
Здесь я нашел отличный пример 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);
Ответ 4
Хотя это старый поток, но, как показано выше, в поисках Google, я хочу добавить небольшой намек, чтобы завершить его, поэтому я напал на него.
Необходимо, чтобы вложенные файлы читались для активности почты, иначе они не будут прикреплены. Поэтому вам нужно позвонить где-нибудь
fileIn.setReadable(true, false)
Ответ 5
Для нескольких вложений используйте 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..."));
Надеюсь, что это поможет;)