Вложения Android не отправляются по электронной почте

1

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

Вот несколько фрагментов кода:

File file = null;
File dir = ProjectViewerResume.this.getCacheDir();
if (dir.canWrite()){
    file = new File(dir, ProjectViewerResume.this.mProject.getName()+".csv");
    FileOutputStream out = new FileOutputStream(file);
    out.write(csv.toString().getBytes());
    out.close();
}
Uri u1 = null;

u1 = Uri.fromFile(file);

Intent sendIntent = new Intent(Intent.ACTION_SEND);
sendIntent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
sendIntent.putExtra(Intent.EXTRA_SUBJECT, "Project Resume: "+
                ProjectViewerResume.this.mProject.getName());
sendIntent.putExtra(Intent.EXTRA_STREAM, u1);
sendIntent.setType("text/csv");
startActivity(sendIntent);

Переменная csv имеет содержимое файла в формате csv. Я пропустил try..catch, поэтому код кажется более чистым..

Предварительно

  • 1
    Вы должны помнить, что приложение электронной почты не может получить доступ к файлам из личного хранилища ваших приложений, чтобы прикрепить к сообщению электронной почты вы переместите свой файл в место, к которому приложение электронной почты может получить доступ, например, во внешнее хранилище.
Теги:
android-intent

3 ответа

0

Этот код теперь работает для меня.
Использование createTempFile вместо openFileOutput. Я до сих пор не знаю, что было не так с прежним подходом.
Он прикрепляет файл с именем LogCat.log.gzip, который на этот раз не пуст, и у него есть данные, которые я помещаю insde.

        public void run() {
            Uri uriLog = null;
            try {
                File gzipFile = File.createTempFile("LogCat.log", ".gzip");
                FileOutputStream out = new FileOutputStream(gzipFile);
                out.write(gzip(dump().getBytes()));
                out.close();
                uriLog = Uri.fromFile(gzipFile);
            }
            catch (IOException e) {
                e.printStackTrace();
            }

            Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND);
            emailIntent.setType("text/plain");
            emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, "Android Log");
            emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, dump());
            emailIntent.putExtra(android.content.Intent.EXTRA_STREAM, uriLog);
            try {
                String str = getResources().getString(R.string.send_prompt);
                Intent chooser = Intent.createChooser(emailIntent, str);
                startActivity(chooser);
            }
            catch (Exception e) {
                e.printStackTrace();
            }
        }
    }).start();

И не забудьте добавить эту строку в свой манифест:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
0

У меня точно такая же проблема. Чтобы не дублировать один и тот же пост, я хочу показать вам свой код, который немного отличается от вашего, но все равно отправляет электронное письмо с вложением 0 КБ.
Я печатаю 2 сообщения в журнал:

Путь напечатан (я редактировал имя пакета) Размер файла не 0KB !!!
05-11 11:32:58.133: W/Log Viewer(432): Path is /data/data/<package>/files/LogCat.log.gzip
05-11 11:32:58.192: W/Log Viewer(432): The file is 504 bytes

Я остановился внутри кода с отладчиком Eclipse и проверил uriLog: он не является нулевым и содержит правильный путь.

Код:

        public void run() {
            Uri uriLog = null;
            try {
                FileOutputStream out = openFileOutput("LogCat.log.gzip", Context.MODE_PRIVATE);
                out.write(gzip(dump().getBytes()));
                out.close();
                File gzipFile = new File(getFilesDir(), "LogCat.log.gzip");
                //uriLog = Uri.parse("file://" + getFilesDir() + "/LogCat.log.gzip");
                uriLog = Uri.fromFile(gzipFile);
                Log.w(TAG,"Path is " + uriLog.getPath());
                Log.w(TAG,"The file is " + gzipFile.length() + " bytes");
            }
            catch (IOException e) {
                e.printStackTrace();
            }

            Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND);
            emailIntent.setType("text/plain");
            emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, "Android Log");
            emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, dump());
            emailIntent.putExtra(android.content.Intent.EXTRA_STREAM, uriLog);
            try {
                String str = getResources().getString(R.string.send_prompt);
                Intent chooser = Intent.createChooser(emailIntent, str);
                startActivity(chooser);
            }
            catch (Exception e) {
                e.printStackTrace();
            }
        }
    }).start();

Вещи, которые я пробовал:

Я создал uri методом parse (см. Прокомментированную строку Я также помещаю данные внутри тела электронной почты, чтобы проверить, существует ли он → он прибывает в электронную почту Я также попытался поместить gziped данные в тело письма, чтобы проверить, существует ли он → он прибыл в электронную почту
РЕДАКТИРОВАТЬ:
Пробовал отправить уже существующий файл в эмулятор, из /mnt/system/app/CustomLocale.apk
23745 байта Путь из uriLog.getPath() был напечатан /apk/CustomLocale.apk
и почта все еще прибыла с вложением с именем CustomLocale.apk и размером 0 КБ Изображение 174551

Единственное, что происходит со мной, это неудача, заключается в том, что putextra (intent.EXTRA_STREAM, uri) основан на

public Intent putExtra (String name, Parcelable value) 

и uris реализуют разборчивый интерфейс. Но по какой-то причине, которую я буду исследовать, возможно, вызов writeToParcel (Parcel out, int flags) не записывает данные файла; почему он 0KB в приложении.

  • 0
    Я думаю, что проблема заключается в том, что почтовый клиент не может получить доступ (из соображений безопасности) к пути /data/data/<package>/files/LogCat.log.gzip, где у вас есть файл. Только ваше собственное приложение может сделать это. Попробуйте сохранить его где-нибудь еще, где почтовый клиент имеет разрешение на доступ.
0

Вы можете попробовать это....

Intent sendIntent = new Intent(Intent.ACTION_SEND);
    sendIntent.setType("text/plain");
    sendIntent.putExtra(Intent.EXTRA_SUBJECT, "Subject of Email");
    sendIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("/mnt/sdcard/file.csv"));
    sendIntent.putExtra(Intent.EXTRA_TEXT, "Enjoy the mail");
    startActivity(Intent.createChooser(sendIntent, "Email:"));    

Если возникла какая-либо проблема при прикреплении файла, попробуйте выполнить следующий путь.

sendIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("file:///sdcard/file.csv"));
  • 6
    Не проводные пути. Используйте Environment.getExternalStorageDirectory() для определения корня внешнего хранилища.
  • 0
    ты пробовал это?
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню