Пытаюсь прикрепить файл с SD-карты на email
Я пытаюсь запустить намерение отправить электронное письмо. Все это работает, но когда я пытаюсь отправить электронное письмо, происходит несколько "странных" вещей.
здесь код
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 ответов:
также получить ту же проблему
код:
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 длины. Когда я проверяю файловую систему, файл там и правильный. Код, который создает файл изображения хорошо закончен до попытки отправить его по электронной почте.
кто-нибудь исправил это без волшебных перезагрузок (я уже пробовал это)?
С уважением,
Финобновление
путь для меня должен был быть
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.разбор "use" Uri.fromFile (новый файл (среда.getExternalStorageDirectory(),"имя файла"))"
окружающая среда.getExternalStorageDirectory () - путь к SDcard или любому другому внешнему хранилищу
похоже, что это на самом деле правильно, не уверен, что происходит, но после перезагрузки он начал работать :/
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..."));
Я получил ту же проблему и везде искал решение. Наконец, я решил это, найдя приложение с открытым исходным кодом, которое работало из коробки и посмотрело, как они это сделали. Код довольно длинный, поэтому я не буду цитировать его здесь, но опубликую ссылку. Посмотрите на функцию sendEmail в строке 449
I рефакторинг мой код, чтобы быть похожим, и теперь он работает. Я надеюсь, что это поможет другим в такой же ситуации.
URL файла принимает вид:
file://<host>/<path>здесь хоста - полное доменное имя системы какой путь доступен, и путь - это иерархическая путь к каталогу формы каталог / directory/.../ имя.
Так это file: / / / path/from / root так же, как http://host/path/from/root потому что есть неявный 'localhost' между второй и третьей косой чертой. Но, как уже упоминалось выше, используйте Uri.FromFile (), чтобы построить его.
у меня были те же симптомы. В моем случае это было потому, что я изначально сохранял вложение с разрешениями
MODE_PRIVATE. Как только я изменил его наMODE_WORLD_READABLEпохоже, что GMail смог получить доступ к файлу и отправить вложение правильно.
Это прекрасно работает для меня: На этом решении Nicolas создает одну копию внутри папки кэша, и здесь gmail intent имеет доступ! 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...")); }
также попробуйте добавить намерение.addFlags(умысла.FLAG_GRANT_READ_URI_PERMISSION); это помогло с моей проблемой.
у меня есть решение по этому поводу через 4 дня, обратите внимание на следующие моменты, давая путь к файлу класса В Android (Java):
1) Использовать путь для внутренней строки хранения 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 is это же иначе......
например
File file=new File(path); long=file.length();//in Bytes
отправить письмо с вложением: (по документам)
Intent emailIntent = новое намерение(намерение.ACTION_SEND); электронная почта.setType(HTTP.PLAIN_TEXT_TYPE);
emailIntent.putExtra ("намерением".EXTRA_EMAIL, новая строка [] {"[email protected]"});
emailIntent.putExtra ("намерением".EXTRA_SUBJECT, " тема электронной почты"); электронная почта.putExtra ("намерением".EXTRA_TEXT, " текст сообщения электронной почты"); электронная почта.putExtra ("намерением".EXTRA_STREAM, Ури.parse ("content: / / path / to / email / attachment"));
// вы также можете прикрепить несколько элементов, передав ArrayList Uris
Comments