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

голоса
68

Я пытаюсь запустить 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 Это показывает приложение, позволяет мне тип, который электронная почта является и редактировать тело & предмет. Ничего страшного. Я ударил отправить, и он посылает. Единственное вложение НЕ присылает.

Так. Я подумал, почему бы не попробовать ж / контекст меню E-mail (для моей резервной копии учетной записи электронной почты на моем телефоне). Это показывает вложение, но не содержит текста в теле или теме. Когда я посылаю его, крепление посылает правильно. Это привело бы меня поверить, что-то совершенно неправильно. Мне нужно новое разрешение в Manifest запуска намерения отправить электронную почту ж / вложение ли? Что я делаю не так?

Задан 25/02/2009 в 22:23
источник пользователем
На других языках...                            


13 ответов

голоса
94

Также получение та же проблема

Код:

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 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/me@gmail.com(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));

Надеюсь, это поможет. Он взял меня возрастов, чтобы отладить.

С уважением,
Финли

Ответил 14/08/2009 в 19:57
источник пользователем

голоса
21

Просто немного замечания с моей стороны. У меня были те же проблемы с 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));

делает.

С уважением, Михаил

Ответил 20/07/2010 в 13:54
источник пользователем

голоса
7

вместо "Uri.parse" использовать "Uri.fromFile (новый файл (Environment.getExternalStorageDirectory ()," Имя файла "))"

Environment.getExternalStorageDirectory () - путь к SDcard или любого другого внешнего запоминающего устройства

Ответил 07/07/2010 в 14:09
источник пользователем

голоса
4
    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..."));
Ответил 18/06/2013 в 15:16
источник пользователем

голоса
4

Оказывается, что это на самом деле правильно, не уверен, что происходит, но после перезагрузки она начала работать: /

Ответил 26/02/2009 в 00:10
источник пользователем

голоса
3

Из RFC 1738 раздел 3.10:

Файл URL имеет вид:

   file://<host>/<path>

где хозяин является полным доменным именем системы , на которой путь доступен, и путь иерархический путь к каталогу в виде каталога / /.../ имени каталога .

Так что файл: /// путь / с / корня так же , как HTTP: // хост / путь / с / корня , потому что есть неявный «локальные» между второй и третьей косой чертой. Но , как упоминалось выше, использовать Uri.FromFile () , чтобы построить его.

Ответил 17/01/2012 в 13:30
источник пользователем

голоса
3

У меня такая же проблема, и искал везде для решения. В конце концов я решил ее найти приложение с открытым исходным кодом, который работал из коробки и смотрел на то, как они это делали. Код довольно долго, так что я не буду цитировать его здесь, но киньте ссылку. Посмотрите на функцию SendEmail в строке 449

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

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

Ответил 26/11/2010 в 22:54
источник пользователем

голоса
0

Отправить по электронной почте с приложением: (по документации)

Намерение emailIntent = новое Намерение (Intent.ACTION_SEND); emailIntent.setType (HTTP.PLAIN_TEXT_TYPE);

emailIntent.putExtra (Intent.EXTRA_EMAIL, новый String [] { "jon@example.com"});

emailIntent.putExtra (Intent.EXTRA_SUBJECT, "Тема сообщения"); emailIntent.putExtra (Intent.EXTRA_TEXT, "текст Отправить сообщение"); emailIntent.putExtra (Intent.EXTRA_STREAM, Uri.parse ( "Содержание: // путь / к / электронной почте / вложение"));

// Вы также можете прикрепить несколько элементов, передавая ArrayList из Юриса

Ответил 07/11/2016 в 06:34
источник пользователем

голоса
0

Я получил решение по этому вопросу после 4-х дней, пожалуйста, обратите внимание следующие моменты в то время давая путь к классу файлов в Android (Java):

1) Использование путь для внутреннего хранения струнного пути = "/ хранение / sdcard0 / myfile.txt";

2) Путь = "/ хранение / 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
Ответил 12/09/2016 в 07:11
источник пользователем

голоса
0

Также попробуйте добавить Intent.addFlags (Intent.FLAG_GRANT_READ_URI_PERMISSION); Это помогло с моим вопросом.

Ответил 01/01/2015 в 19:39
источник пользователем

голоса
0
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..."));
        }
Ответил 19/12/2014 в 14:03
источник пользователем

голоса
0

Это работает отлично для меня: В этом решении Nicolas создать одну копию внутри папки Cache и здесь Gmail Намерение имеет доступ! http://stephendnicholas.com/archives/974

Ответил 01/06/2013 в 04:39
источник пользователем

голоса
0

У меня были такие же симптомы. В моем случае это было потому , что я был первоначально сохранить прикрепленный файл с разрешениями MODE_PRIVATE. Как только я изменил его на MODE_WORLD_READABLEнего , кажется , GMail был тогда в состоянии получить доступ к файлу и отправить вложение правильно.

Узнать больше

Ответил 02/03/2013 в 23:47
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more