Я разрабатываю приложение 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, поэтому код кажется более чистым..
Предварительно
Этот код теперь работает для меня.
Использование 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 КБ.
Я печатаю 2 сообщения в журнал:
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();
Вещи, которые я пробовал:
Единственное, что происходит со мной, это неудача, заключается в том, что putextra (intent.EXTRA_STREAM, uri) основан на
public Intent putExtra (String name, Parcelable value)
и uris реализуют разборчивый интерфейс. Но по какой-то причине, которую я буду исследовать, возможно, вызов writeToParcel (Parcel out, int flags) не записывает данные файла; почему он 0KB в приложении.
Вы можете попробовать это....
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"));
Environment.getExternalStorageDirectory()
для определения корня внешнего хранилища.