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

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

188   13  

13 ответов:

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

код:

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

кто-нибудь исправил это без волшебных перезагрузок (я уже пробовал это)?

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

обновление

путь для меня должен был быть

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[]{"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

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

С RFC 1738 3.10:

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, новая строка [] {"jon@example.com"});

emailIntent.putExtra ("намерением".EXTRA_SUBJECT, " тема электронной почты"); электронная почта.putExtra ("намерением".EXTRA_TEXT, " текст сообщения электронной почты"); электронная почта.putExtra ("намерением".EXTRA_STREAM, Ури.parse ("content: / / path / to / email / attachment"));

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

    Ничего не найдено.

Добавить ответ:
Отменить.