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