У меня есть программно сгенерированное изображение, которое я хочу отправить в виде вложения с помощью методов ACTION_SEND
и EXTRA_STREAM
.
Но как мне это сделать?
My Первая попытка (запись в мой путь к файлу на основе context.getCacheDir ()
), похоже, работала в предварительном просмотре Gmail (без предварительного просмотра изображения, но было видно имя и значок вложенного файла), но вложение так и не пришло на сторона получателя. Я думаю, это как-то связано с разрешениями для сгенерированного файла, но как этого избежать? Нужно ли устанавливать более разрешающие настройки для этих сгенерированных файлов (чтобы доступ к активности Gmail был доступен)? Возможно ли это даже для папки кэша приложения?
Есть ли другое местоположение файла, в которое было бы лучше записать мои файлы? Я рассмотрел папку загрузок, но думаю, что это будет неудобное место для чего-то, что должно существовать только до тех пор, пока оно не будет отправлено по электронной почте.
Я даже пытался кодировать свое изображение исключительно в данных: image / png; base64, ABCD ...
URI стиля. Это также обнаружилось в предварительном просмотре Gmail (значок вложения, но без имени файла), но не привело к вложению на стороне получателя.
Кто-нибудь смог прикрепить одноразовое сгенерированное изображение к намерению электронной почты с помощью любые значения? Какие варианты я мог пропустить?
На самом деле моя проблема состояла из двух частей:
context.getCacheDir()
является приватным для вашего приложения. Вы не можете поместить что-то туда и ожидать, что другое приложение сможет получить к нему доступ. image/png
ради моего вложения. Кроме того, исследования показали, что помещать (потенциально большие) изображения в основную память было не очень хорошей идеей, даже если вы собирались немедленно очистить ее.
После того, как я сделал это и записал сгенерированные изображения в общедоступное место на SD-карту, все заработало нормально.
Итак, вкратце:
Запросите доступ к SD-карте в своем манифесте
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Убедитесь, что SD-карта доступна
if (!Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()))
{
//Bail gracefully
}
Создайте каталог на SD-карте
File pngDir = new File(
Environment.getExternalStorageDirectory(),
//Loose convention inferred from app examples
"Android/data/com.somedomain.someapp/flotsam");
if (!pngDir.exists())
pngDir.mkdirs();
Запишите свой файл в этот каталог и запишите Uri
File pngFile = new File(pngDir, "jetsam.png");
//Save file encoded as PNG
Uri pngUri = Uri.fromFile(pngFile);
Создайте намерение ACTION_SEND
Intent intent = new Intent(android.content.Intent.ACTION_SEND);
intent.setType("image/png"); //
intent.putExtra(android.content.Intent.EXTRA_EMAIL, new String[] { "someone@somewhere.com" });
intent.putExtra(android.content.Intent.EXTRA_SUBJECT, "Portable Network Graphics");
intent.putExtra(android.content.Intent.EXTRA_CC, new String[] { "carbon@somewhere.com" });
intent.putExtra(Intent.EXTRA_TEXT, "Something textual");
intent.putExtra(Intent.EXTRA_STREAM, pngUri);
А затем начните действие
context.startActivity(Intent.createChooser(intent, "Something Pithy"));
А затем убедитесь, что вы все очистили...
Предупреждение 1
Похоже, будет больше поддержки для каталогов SD-карт для конкретных приложений, но, увы, не в моей требуемой версии SDK.
Предостережение 2
Это обзор решения, которое в конечном итоге сработало для меня. Это не обязательно подход «наилучшей практики».
Предупреждение 3
Это означает, что приложение должно иметь установленную SD-карту, чтобы иметь доступ к функции прикрепления изображений, но это было полностью приемлемо для моего варианта использования. Ваш пробег может отличаться. Если SD-карта недоступна, я добавляю к письму дружеское примечание, объясняющее, почему изображения не могут быть прикреплены, и как исправить ситуацию.