Попытка прикрепить файл с 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