Вопрос по image, android, attachment, dynamically-generated, email – Android: как прикрепить временное сгенерированное изображение к электронному письму?

16

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

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

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

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

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

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

Ваш Ответ

3   ответа
4

Я только что столкнулся с точно такой же проблемой (желая прикрепить текстовый файл в моем случае). Если вы посмотрите в журнале Android, причина этого:

02-28 21:01:28.434: E/Gmail(19673): file:// attachment paths must point to file:///mnt/sdcard. Ignoring attachment file:///data/data/com.stephendnicholas.gmailattach/cache/Test.txt

В качестве обходного пути (как упомянуто HRJ) вы можете использовать ContentProvider для предоставления доступа к файлам во внутреннем кеше вашего приложения, чтобы Gmail мог их прикрепить. Я только что написалСообщение блога о том, как это сделать.

Надеюсь, это поможет :)

ContentProvider был решением, с которым я пошел. Я не хотел, чтобы все могли читать мои файлы с SD-карты. Carlos
-1
tableLayout.buildDrawingCache();
        Bitmap test = Bitmap.createBitmap(tableLayout.getDrawingCache());
        tableLayout.destroyDrawingCache();

        Log.d("Image", test.toString());

        String path = Environment.getExternalStorageDirectory().toString(); 
        Log.d("Path", path);
        File file = new File(path,"mail_image.png");
        Uri pngUri = Uri.fromFile(file);
        Log.d("Real Image Path", pngUri.toString());

        Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND);
        emailIntent.setType("image/png");
        emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, "email to"); 
        emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT,"Subject"); 
        emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, "From My App"); 
                    emailIntent.putExtra(android.content.Intent.EXTRA_STREAM, pngUri );

        startActivity(Intent.createChooser(emailIntent, "Send mail..."));
18

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

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[] { "[email protected]" });
intent.putExtra(android.content.Intent.EXTRA_SUBJECT, "Portable Network Graphics");
intent.putExtra(android.content.Intent.EXTRA_CC, new String[] { "[email protected]" });
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-карта недоступна, я добавляю в электронное письмо дружескую заметку, объясняющую, почему изображения не могут быть прикреплены и как исправить ситуацию.

@HRJ Можете ли вы уточнить эту возможность с ответом? Я хотел бы видеть больше деталей о том, как это можно сделать ... el2iot2
Может ли это быть сделано с обычаемContentProvider, Это не потребует дополнительного разрешения, а также снимет зависимость от SD-карты. HRJ
@Paschalis на какую версию андроида вы ориентируетесь? Прошло много времени с тех пор, как я использовал это решение ... el2iot2
это решение не работает для меня. Самое странное, что файл изображений создается на SD-карте! Paschalis
цель - 4.1 @devfuel. мин СДК 2.0, макс 4.1, цель 4.1 Paschalis

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