android导出到csv并作为电子邮件附件发送
Posted
技术标签:
【中文标题】android导出到csv并作为电子邮件附件发送【英文标题】:android exporting to csv and sending as email attachment 【发布时间】:2011-07-21 01:00:38 【问题描述】:我在这个网站上看到了多个线程讨论关于在 android 中发送带有附件的电子邮件。我尝试了here、here 和here 讨论的所有方法。
我正在通过代码创建一个 csv 文件并将此文件保存到 android 内部存储中。然后我想将此文件作为附件发送到电子邮件中。嗯,电子邮件正在发送,我收到它没有附件。这就是我所做的。
String columnString = "\"Person\",\"Gender\",\"Street1\",\"PostOfice\",\"Age\"";
String dataString = "\"" + currentUser.userName +"\",\"" + currentUser.gender + "\",\"" + currentUser.street1 + "\",\"" + currentUser.poNumber.toString() + "\",\"" + currentUser.age.toString() + "\"";
String combinedString = columnString + "\n" + dataString;
File file = new File(this.getCacheDir()+ File.separator + "Data.csv");
try
FileOutputStream out = new FileOutputStream(file);
out.write(combinedString.getBytes());
out.close();
catch (IOException e)
Log.e("BROKEN", "Could not write file " + e.getMessage());
Uri u1 = Uri.fromFile(file);
Intent sendIntent = new Intent(Intent.ACTION_SEND);
sendIntent.putExtra(Intent.EXTRA_SUBJECT, "Person Details");
sendIntent.putExtra(Intent.EXTRA_STREAM, u1);
sendIntent.setType("text/richtext");
startActivity(sendIntent);
我尝试将 mime 设置更改为“text/html”和“text/richtext”等。但还没有运气。谁能告诉我我做错了什么?
【问题讨论】:
您是否尝试在将其放入意图之前打印 URI? 是的,我得到了 file:///Data.csv 我认为它应该是什么......是吗? 不...您应该使用 sdcard 或其他东西。我不认为该应用程序可以在根目录中创建文件。顺便说一句,您可以使用 adb shell 进行验证。 怎么样,你能详细说明一下吗? SDCard也意味着外部存储器,对吗?如果我没有呢? 您也可以尝试 getCacheDir() 并将数据存储在那里。您可以在此处获取详细信息 [developer.android.com/reference/android/content/…. 【参考方案1】:感谢所有试图提供帮助的人..花了一整天的时间后,我从我的应用程序发送了一封带有附件的电子邮件..这是工作代码..
String columnString = "\"PersonName\",\"Gender\",\"Street1\",\"postOffice\",\"Age\"";
String dataString = "\"" + currentUser.userName +"\",\"" + currentUser.gender + "\",\"" + currentUser.street1 + "\",\"" + currentUser.postOFfice.toString()+ "\",\"" + currentUser.age.toString() + "\"";
String combinedString = columnString + "\n" + dataString;
File file = null;
File root = Environment.getExternalStorageDirectory();
if (root.canWrite())
File dir = new File (root.getAbsolutePath() + "/PersonData");
dir.mkdirs();
file = new File(dir, "Data.csv");
FileOutputStream out = null;
try
out = new FileOutputStream(file);
catch (FileNotFoundException e)
e.printStackTrace();
try
out.write(combinedString.getBytes());
catch (IOException e)
e.printStackTrace();
try
out.close();
catch (IOException e)
e.printStackTrace();
Uri u1 = null;
u1 = Uri.fromFile(file);
Intent sendIntent = new Intent(Intent.ACTION_SEND);
sendIntent.putExtra(Intent.EXTRA_SUBJECT, "Person Details");
sendIntent.putExtra(Intent.EXTRA_STREAM, u1);
sendIntent.setType("text/html");
startActivity(sendIntent);
此外,如果您已将手机 SDCard 安装在机器中,则此代码将不起作用。一次只有一个人可以访问 SDCard。因此,在这种情况下,从计算机上卸载您的 SDCard 并尝试..感谢回答 here.. 的人。另外请确保您已经购买了在清单文件中写入外部存储的权限...
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
希望它对某人有所帮助...感谢所有尝试提供帮助的人..
【讨论】:
实际上你的代码在 android 设备上工作,但不适用于模拟器,当我在模拟器上运行应用程序时,它会强制关闭并在 u1 = Uri.fromFile(file); 处给出 nuul 指针异常。你能告诉我resion为什么请 如果您想共享私有文件(即,存储在内部),那么您必须使用 ContentProvider。看到这个链接:***.com/a/9645127/1172181【参考方案2】:本准则将为您提供帮助
@Override
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
buttonSend = (Button) findViewById(R.id.buttonSend);
textTo = (EditText) findViewById(R.id.editTextTo);
textSubject = (EditText) findViewById(R.id.editTextSubject);
textMessage = (EditText) findViewById(R.id.editTextMessage);
buttonSend.setOnClickListener(new OnClickListener()
@Override
public void onClick(View v)
String to = textTo.getText().toString();
String subject = textSubject.getText().toString();
String message = textMessage.getText().toString();
Intent i = new Intent(Intent.ACTION_SEND);
i.setType("plain/text");
File data = null;
try
Date dateVal = new Date();
String filename = dateVal.toString();
data = File.createTempFile("Report", ".csv");
FileWriter out = (FileWriter) GenerateCsv.generateCsvFile(
data, "Name,Data1");
i.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(data));
i.putExtra(Intent.EXTRA_EMAIL, new String[] to );
i.putExtra(Intent.EXTRA_SUBJECT, subject);
i.putExtra(Intent.EXTRA_TEXT, message);
startActivity(Intent.createChooser(i, "E-mail"));
catch (IOException e)
e.printStackTrace();
);
public class GenerateCsv
public static FileWriter generateCsvFile(File sFileName,String fileContent)
FileWriter writer = null;
try
writer = new FileWriter(sFileName);
writer.append(fileContent);
writer.flush();
catch (IOException e)
// TODO Auto-generated catch block
e.printStackTrace();
finally
try
writer.close();
catch (IOException e)
// TODO Auto-generated catch block
e.printStackTrace();
return writer;
在AndroidManifest.xml
文件中添加这一行:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission
【讨论】:
嗨@ADR 我似乎无法让上面的代码在我的应用程序中工作。它不会向收件人发送附件。当我创建电子邮件时,它附加了一个虚拟文件,其中没有任何信息。在代码中它提到“文件名”和“输出”未使用“未使用局部变量文件名的值”。 为文件设置正确的 mime 类型有效。 i.setType("纯文本");【参考方案3】:试试
sendIntent.setType("message/rfc822");
【讨论】:
试试这个。 groups.google.com/group/android-developers/browse_thread/thread/…【参考方案4】:对于内部存储文件,需要使文件可读:
shareFile.setReadable(true, false);
【讨论】:
【参考方案5】:以下是邮件中 csv 文件附件的代码(其工作代码): MyCsvFile.csv" 应该存在于您手机的内部/外部存储器中。
更多信息请查看:https://***.com/a/48643905/8448886
以下是将 csv 文件附加到邮件中的代码:
String csv = (Environment.getExternalStorageDirectory().getAbsolutePath() + "/MyCsvFile.csv"); // Here csv file name is MyCsvFile.csv
button.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View view)
Intent emailIntent = new Intent(Intent.ACTION_SEND);
emailIntent.setType("text/plain");
emailIntent.putExtra(Intent.EXTRA_EMAIL, new String[]"email@example.com");
emailIntent.putExtra(Intent.EXTRA_SUBJECT, "subject here");
emailIntent.putExtra(Intent.EXTRA_TEXT, "body text");
File file = new File(csv);
Uri uri = Uri.fromFile(file);
emailIntent.putExtra(Intent.EXTRA_STREAM, uri);
startActivity(Intent.createChooser(emailIntent, "Pick an Email provider"));
);
【讨论】:
以上是关于android导出到csv并作为电子邮件附件发送的主要内容,如果未能解决你的问题,请参考以下文章
Biztalk:包含映射到 CSV 的电子邮件的 XML,作为附件发送