Попытка прикрепить файл с 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, он показывает вложение, позволяет мне вводить имя электронной почты и редактировать тело и тему. Ничего страшного. Я ударил отправить, и он отправляет. Единственное, что привязка НЕ отправляется.
Итак. Я понял, почему бы не попробовать его с контекстом меню электронной почты (для моей резервной учетной записи электронной почты на моем телефоне). Он показывает прикрепление, но никакого текста вообще нет в теле или предмете. Когда я отправляю его, приложение отправляется правильно. Это заставило бы меня поверить, что что-то не так. Нужно ли мне новое разрешение на запуск манифеста с целью отправки электронной почты с приложением? Что я делаю неправильно?
Ответы
Ответ 1
Также получение той же проблемы
код:
Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND);
emailIntent.setType("image/jpeg");
emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, new String[]
{"[email protected]"});
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/[email protected](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
Ответ 2
Просто небольшое замечание с моей стороны. У меня были те же проблемы с 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));
делает.
С уважением,
Майкл
Ответ 3
вместо "Uri.parse" использовать "Uri.fromFile(новый файл (Environment.getExternalStorageDirectory()," имя файла "))"
Environment.getExternalStorageDirectory() - путь к SD-карте или любому другому внешнему хранилищу
Ответ 4
Похоже, что это действительно правильно, не уверен, что происходит, но после перезагрузки он начал работать:/
Ответ 5
Intent i = new Intent(Intent.ACTION_SEND);
i.setType("message/rfc822");
i.putExtra(Intent.EXTRA_EMAIL , new String[]{"[email protected]"});
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..."));
Ответ 6
У меня такая же проблема, и я искал везде решение. Наконец, я решил это, найдя приложение с открытым исходным кодом, которое работало из коробки, и посмотрел, как они это сделали. Код довольно длинный, поэтому я не буду приводить его здесь, а опубликовать ссылку. Посмотрите на функцию sendEmail в строке 449
http://rehearsalassist.svn.sourceforge.net/viewvc/rehearsalassist/android/trunk/src/urbanstew/RehearsalAssistant/SessionPlayback.java?revision=94&view=markup
Я переработал свой код, чтобы быть похожим, и теперь он работает. Надеюсь, это поможет другим в той же ситуации.
Ответ 7
Из RFC 1738 раздел 3.10:
URL-адрес файла принимает форму:
file://<host>/<path>
где host - это полное доменное имя системы на доступный путь, а путь - иерархический путь к каталогу каталога/каталога/.../name формы.
Итак, это файл:///path/from/root, как http://host/path/from/root, потому что есть неявный "localhost" между вторым и третья косая черта. Но, как упоминалось выше, используйте Uri.FromFile() для его создания.
Ответ 8
У меня были те же симптомы. В моем случае это было потому, что я сначала сохранил вложение с разрешениями MODE_PRIVATE
. Как только я изменил его на MODE_WORLD_READABLE
, похоже, GMail смог получить доступ к файлу и отправить приложение должным образом.
Подробнее
Ответ 9
Он отлично работает для меня:
На этом решении Nicolas создает одну копию в папке Cache, и здесь у gmail есть доступ!
http://stephendnicholas.com/archives/974
Ответ 10
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..."));
}
Ответ 11
Также попробуйте добавить Intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); Это помогло мне в моей проблеме.
Ответ 12
У меня есть решение по этому поводу через 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
Ответ 13
Отправить электронное письмо с приложением: (по документам)
Intent emailIntent = новый Intent (Intent.ACTION_SEND); emailIntent.setType(HTTP.PLAIN_TEXT_TYPE);
emailIntent.putExtra(Intent.EXTRA_EMAIL, новая строка [] { "[email protected]" });
emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Тема электронной почты" ); emailIntent.putExtra(Intent.EXTRA_TEXT, "Текст сообщения электронной почты" ); emailIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse( "Содержание://путь/к/электронной почте/вложение" ));
//Вы также можете прикрепить несколько элементов, передав ArrayList of Uris