Android: как отправить снимок экрана по электронной почте, не сохраняя его на SD-карту?

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


person Adrian M    schedule 28.07.2015    source источник
comment
Как вы планируете отправлять письмо? ACTION_SEND? ACTION_SENDTO? JavaMail? Что-то другое?   -  person CommonsWare    schedule 28.07.2015
comment
Я использую ACTION_SEND   -  person Adrian M    schedule 28.07.2015
comment
И что плохого в том, чтобы сохранить его, а затем удалить? На самом деле это кажется лучшим подходом для меня, поскольку, если по какой-либо причине приложение выйдет из строя, оно сможет возобновить работу и отправить изображение.   -  person Nir Alfasi    schedule 28.07.2015


Ответы (1)


Вы можете попробовать создать поток ContentProvider, который использует конвейер, а не файл, для ParcelFileDescriptor, возвращаемого openFile(). Ваш провайдер предоставит скриншот из кучи, записывая в OutputStream, который вы получаете с вашего конца канала. Затем вы должны передать Uri потоку вашего провайдера в дополнительном EXTRA_STREAM для вложения. Этот пример приложения иллюстрирует технику, хотя в моем случае я чтение в файл для записи в OutputStream.

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

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

первое сохранение растрового изображения на SD-карту

Приблизительно ноль примеров продемонстрирует это как съемное хранилище недоступен разработчикам. Эти примеры, вероятно, демонстрируют запись во внешнее хранилище. .

person CommonsWare    schedule 28.07.2015
comment
Есть ли способ сохранить изображение в каком-то кеше, а затем вызвать его оттуда? - person Adrian M; 28.07.2015
comment
@AdrianM: Как отмечено в моем ответе, если вас беспокоит то, что файл находится во внешнем хранилище, запишите снимок экрана во внутреннее хранилище и используйте FileProvider для его обслуживания. Вы можете иметь файл в getCacheDir(), который является частью вашего внутреннего хранилища, из которого FileProvider может обслуживать. - person CommonsWare; 28.07.2015