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

StackOverflow https://stackoverflow.com/questions/587917

Вопрос

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

вот код

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.

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

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

От РФК 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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top