Android: как прикрепить временное сгенерированное изображение к электронному письму?

У меня есть программно сгенерированное изображение, которое я хочу отправить в виде вложения с помощью методов ACTION_SEND и EXTRA_STREAM .

Но как мне это сделать?

My Первая попытка (запись в мой путь к файлу на основе context.getCacheDir () ), похоже, работала в предварительном просмотре Gmail (без предварительного просмотра изображения, но было видно имя и значок вложенного файла), но вложение так и не пришло на сторона получателя. Я думаю, это как-то связано с разрешениями для сгенерированного файла, но как этого избежать? Нужно ли устанавливать более разрешающие настройки для этих сгенерированных файлов (чтобы доступ к активности Gmail был доступен)? Возможно ли это даже для папки кэша приложения?

Есть ли другое местоположение файла, в которое было бы лучше записать мои файлы? Я рассмотрел папку загрузок, но думаю, что это будет неудобное место для чего-то, что должно существовать только до тех пор, пока оно не будет отправлено по электронной почте.

Я даже пытался кодировать свое изображение исключительно в данных: image / png; base64, ABCD ... URI стиля. Это также обнаружилось в предварительном просмотре Gmail (значок вложения, но без имени файла), но не привело к вложению на стороне получателя.

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

16
задан el2iot2 25 August 2010 в 23:08
поделиться

1 ответ

На самом деле моя проблема состояла из двух частей:

  1. context.getCacheDir() является приватным для вашего приложения. Вы не можете поместить что-то туда и ожидать, что другое приложение сможет получить к нему доступ.
  2. Я неправильно понял, какой MIME-тип следует использовать. Несмотря на то, что я отправлял текст электронной почты, мне действительно нужно было указать 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-карта недоступна, я добавляю к письму дружеское примечание, объясняющее, почему изображения не могут быть прикреплены, и как исправить ситуацию.

18
ответ дан 30 November 2019 в 22:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: