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