Попытка прикрепить файл с SD-карты к электронной почте

Я пытаюсь запустить 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, он показывает вложение, позволяет мне вводить имя электронной почты и редактировать тело и тему. Ничего страшного. Я нажимаю send, и он отправляет. Единственное, что вложение НЕ отправляется.

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

Solutions Collecting From Web of "Попытка прикрепить файл с SD-карты к электронной почте"

Также получение той же проблемы

Код:

 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. Когда я проверяю файловую систему, файл там и исправляется. Код, который создает файл изображения, хорошо закончен до попытки отправить его по электронной почте.

Любой исправил это без магии перезагрузки (я уже пробовал это)?

С Уважением,
Плавник

Обновить

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

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

Просто небольшое замечание с моей стороны. У меня были те же проблемы с 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)); 

делает.

С уважением, Майкл

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

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

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

  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...")); 

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

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

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

Из раздела 3.10 RFC 1738 :

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

  file://<host>/<path> 

Где хост – это полное доменное имя системы, доступной для пути , а путьпуть иерархической директории каталога / каталога / … / name формы .

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

У меня были те же симптомы. В моем случае это было потому, что я первоначально сохранил вложение с разрешениями MODE_PRIVATE . Как только я изменил его на MODE_WORLD_READABLE кажется, что GMail смог получить доступ к файлу и отправить приложение должным образом.

Узнать больше

Это отлично работает для меня: на этом решении Nicolas создает одну копию в папке Cache, и здесь у Gmail есть доступ! http://stephendnicholas.com/archives/974

 public void sendMail(String path) { Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND); emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, new String[] {AppConstant.server_mail}); emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, "IBPS ERROR Mail"); emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, "This is an autogenerated mail from IBPS app"); emailIntent.setType("image/png"); Uri myUri = Uri.parse("file://" + path); emailIntent.putExtra(Intent.EXTRA_STREAM, myUri); startActivity(Intent.createChooser(emailIntent, "Send mail...")); } 

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

У меня есть решение по этому поводу через 4 дня. Обратите внимание на следующие моменты, указывая путь к классу File в 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 

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

Intent emailIntent = новый Intent (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 («content: // path / to / email / attachment»));

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