Пытаюсь прикрепить файл с SD-карты к электронной почте.
-
06-09-2019 - |
Вопрос
Я пытаюсь запустить намерение отправить электронное письмо.Все это работает, но когда я пытаюсь отправить электронное письмо, происходит пара «странных» вещей.
вот код
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, он показывает вложение, позволяет мне ввести адрес электронной почты и отредактировать тело и тему.Ничего страшного.Я нажимаю отправить, и оно отправляется.Единственное, вложение НЕ отправляется.
Так.Я подумал, почему бы не попробовать это с контекстом меню «Электронная почта» (для моей резервной учетной записи электронной почты на моем телефоне).Вложение отображается, но в тексте или теме вообще нет текста.Когда я отправляю его, вложение отправляется правильно.Это заставило бы меня поверить, что что-то не так.Нужно ли мне новое разрешение в манифесте для запуска намерения отправить электронное письмо с вложением?Что я делаю не так?
Решение
Тоже получаю ту же проблему
Код:
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:
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
Похоже, поставщик электронной почты прикрепляет файл нулевой длины.Когда я проверяю файловую систему, файл находится там и правильный.Код, создающий файл изображения, тщательно готов к отправке его по электронной почте.
Кто-нибудь исправил это без волшебной перезагрузки (я уже пробовал)?
С уважением,
Плавник
Обновлять
Путь для меня должен был быть
file:///sdcard/DumbDumpers/DumbDumper.jpg
тебе нужно дополнительное /
поскольку это указывает на корневой каталог, т.е.:
file://
+ /sdcard/DumbDumpers/DumbDumper.jpg
в сочетании как
file:///sdcard/DumbDumpers/DumbDumper.jpg
В приведенном выше фрагменте вам нужно:
emailIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("file://"+ sPhotoFileName));
Надеюсь, это поможет.Мне потребовались годы, чтобы отладить.
С уважением,
Финли
Другие советы
Небольшое замечание с моей стороны.У меня были те же проблемы с 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.
Я реорганизовал свой код, чтобы он стал похожим, и теперь он работает.Я надеюсь, что это поможет другим, оказавшимся в такой же ситуации.
От РФК 1738 раздел 3.10:
URL-адрес файла принимает форму:
file://<host>/<path>
где хозяин это полностью квалифицированное доменное имя системы, в которой доступ к пути, и путь это путь иерархического каталога формы каталог/каталог/.../имя.
Итак, это file:///path/from/root, как и http://хост/путь/от/корень потому что между второй и третьей косой чертой есть неявный «localhost».Но, как упоминалось выше, для его сборки используйте Uri.FromFile().
У меня были те же симптомы.В моем случае это произошло потому, что я изначально сохранял вложение с разрешениями MODE_PRIVATE
.Как только я изменил его на MODE_WORLD_READABLE
похоже, GMail смог получить доступ к файлу и правильно отправить вложение.
Это отлично работает для меня:В этом решении Николас создает одну копию в папке 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 дня. Обратите внимание на следующие моменты, указывая путь к классу файлов в Android (Java):
1) Используйте путь для внутреннего хранилища String path="/storage/sdcard0/myfile.txt";
2) путь="/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
Отправьте электронное письмо с вложением:(По документам)
Намерение 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 ("content: // path/to/email/atchetment"));
// Вы также можете прикрепить несколько элементов, передав ArrayList Uris