Попытка прикрепить файл с SD-карты к электронной почте - PullRequest
69 голосов
/ 26 февраля 2009

Я пытаюсь запустить Intent для отправки электронного письма. Все это работает, но когда я пытаюсь отправить электронное письмо, происходит пара «странных» вещей.

вот код

Intent sendIntent = new Intent(Intent.ACTION_SEND);
sendIntent.setType("image/jpeg");
sendIntent.putExtra(Intent.EXTRA_SUBJECT, "Photo");
sendIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("file://sdcard/dcim/Camera/filename.jpg"));
sendIntent.putExtra(Intent.EXTRA_TEXT, "Enjoy the photo");
startActivity(Intent.createChooser(sendIntent, "Email:"));

Так что, если я запускаю, используя контекст меню Gmail, он показывает вложение, позволяет мне указать, кому адресовано письмо, и отредактировать текст и тему. Ничего страшного. Я ударил отправить, и он отправляет. Единственное, вложение НЕ отправляется.

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

Ответы [ 13 ]

96 голосов
/ 14 августа 2009

Также получаю ту же проблему

Код:

Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND); 
    emailIntent.setType("image/jpeg");
    emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, new String[] 
    {"me@gmail.com"}); 
    emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, 
    "Test Subject"); 
    emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, 
    "go on read the emails"); 
    Log.v(getClass().getSimpleName(), "sPhotoUri=" + Uri.parse("file:/"+ sPhotoFileName));
    emailIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("file:/"+ sPhotoFileName));
    startActivity(Intent.createChooser(emailIntent, "Send mail..."));

Из adb logcat:

V/DumbDumpersMain( 3972):   sPhotoUri=file://sdcard/DumbDumpers/DumbDumper.jpg
I/ActivityManager(   56):   Starting activity: Intent { action=android.intent.action.CHOOSER comp={android/com.android.internal.app.ChooserActivity} (has extras) }
I/ActivityManager(   56):   Starting activity: Intent { action=android.intent.action.SEND type=jpeg/image flags=0x3000000 comp={com.google.android.gm/com.google.android.gm.ComposeActivityGmail} (has extras) }
I/ActivityManager(   56):   Starting activity: Intent { action=android.intent.action.SEND type=jpeg/image flags=0x2800000 comp={com.google.android.gm/com.google.android.gm.ComposeActivity} (has extras) }
D/gmail-ls(  120):      MailProvider.query: content://gmail-ls/labels/me@gmail.com(null, null)
D/Gmail   ( 2507):      URI FOUND:file://sdcard/DumbDumpers/DumbDumper.jpg

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

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

С уважением,
Fin

Обновление

Путь для меня должен был быть

file:///sdcard/DumbDumpers/DumbDumper.jpg

вам нужны дополнительные /, так как это указывает на корневой каталог, то есть:

file:// + /sdcard/DumbDumpers/DumbDumper.jpg

объединено как

file:///sdcard/DumbDumpers/DumbDumper.jpg

В приведенном фрагменте необходимо:

emailIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("file://"+ sPhotoFileName));

Надеюсь, это поможет. Отладка заняла у меня целую вечность.

С уважением,
Finlay

21 голосов
/ 20 июля 2010

Просто небольшое замечание с моей стороны. У меня были те же проблемы с GMail, но почему-то это работает, когда я сначала сохраняю файл на SD-карте и извлекаю его оттуда, а не из ресурсов. Итак, мой код следующий:

Intent i = new Intent(Intent.ACTION_SEND);
i.putExtra(Intent.EXTRA_SUBJECT, "Title");
i.putExtra(Intent.EXTRA_TEXT, "Content");
i.putExtra(Intent.EXTRA_STREAM, uri);
i.setType("text/plain");
startActivity(Intent.createChooser(i, "Send mail"));

и здесь

uri = Uri.fromFile(new File(context.getFilesDir(), FILENAME));

не не работает, тогда как

uri = Uri.fromFile(new File(Environment.getExternalStorageDirectory(), FILENAME));

делает.

С уважением, Michael

7 голосов
/ 07 июля 2010

вместо "Uri.parse" используйте "Uri.fromFile (новый файл (Environment.getExternalStorageDirectory ()," имя файла "))"

Environment.getExternalStorageDirectory () - путь к SD-карте или любому другому внешнему хранилищу

4 голосов
/ 18 июня 2013
    Intent i = new Intent(Intent.ACTION_SEND);
    i.setType("message/rfc822");
    i.putExtra(Intent.EXTRA_EMAIL  , new String[]{"example@mail.com"});
    i.putExtra(Intent.EXTRA_SUBJECT, "Data from app");
    i.putExtra(Intent.EXTRA_TEXT   , "experience number x");
    i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 

    Uri uri = Uri.fromFile(new File(Environment.getExternalStorageDirectory(), "filename.txt"));
    i.putExtra(Intent.EXTRA_STREAM, uri);
    startActivity(Intent.createChooser(i, "Send email..."));
4 голосов
/ 26 февраля 2009

Похоже, что это действительно правильно, не уверен, что происходило, но после перезагрузки он начал работать: /

3 голосов
/ 17 января 2012

С RFC 1738 раздел 3.10:

URL-адрес файла принимает форму:

   file://<host>/<path>

, где host - полное доменное имя системы в какой путь доступен, а путь является иерархическим путь к каталогу в форме каталог / каталог /.../ имя .

Итак, это файл: /// path / from / root, как и http://host/path/from/root, потому что между вторым и третьим слешем есть неявный «localhost» Но, как уже упоминалось выше, используйте Uri.FromFile () для его сборки.

3 голосов
/ 27 ноября 2010

Я получил ту же проблему и везде искал решение. Наконец, я решил это, найдя приложение с открытым исходным кодом, которое работало из коробки и посмотрело, как они это сделали. Код довольно длинный, поэтому я не буду здесь его цитировать, а опубликую ссылку. Посмотрите на функцию sendEmail в строке 449

http://rehearsalassist.svn.sourceforge.net/viewvc/rehearsalassist/android/trunk/src/urbanstew/RehearsalAssistant/SessionPlayback.java?revision=94&view=markup

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

0 голосов
/ 07 ноября 2016

Отправить письмо с приложением: (По документам)

Intent emailIntent = новое намерение (Intent.ACTION_SEND); emailIntent.setType (HTTP.PLAIN_TEXT_TYPE);

emailIntent.putExtra (Intent.EXTRA_EMAIL, новая строка [] {"jon@example.com"});

emailIntent.putExtra (Intent.EXTRA_SUBJECT, «Тема письма»); emailIntent.putExtra (Intent.EXTRA_TEXT, «Текст сообщения электронной почты»); emailIntent.putExtra (Intent.EXTRA_STREAM, Uri.parse ( "Содержание: // путь / к / электронной почте / вложение"));

// Вы также можете прикрепить несколько элементов, передав ArrayList of Uris

0 голосов
/ 12 сентября 2016

У меня есть решение по этому вопросу через 4 дня. Обратите внимание на следующие моменты при указании пути к классу файлов в Android (Java):

1) Использовать путь для внутреннего хранилища String path = "/ storage / sdcard0 / myfile.txt";

2) path = "/ storage / sdcard1 / myfile.txt";

3) упомянуть разрешения в файле манифеста.

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

4) Сначала проверьте длину файла для подтверждения.

5) Проверить пути в ES File Explorer на предмет sdcard0 и sdcard1 - это то же самое или иначе ......

, например

File file=new File(path); 
long=file.length();//in Bytes
0 голосов
/ 01 января 2015

Также попробуйте добавить Intent.addFlags (Intent.FLAG_GRANT_READ_URI_PERMISSION); Это помогло с моей проблемой.

...