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,作为附件发送

从 html 表单发送带有 csv 附件的电子邮件

发送带有数据框的电子邮件作为附件

在没有 CSV 的情况下将 CSV 附加到 Python 中的电子邮件

用于发送带有附件的电子邮件的 GMAIL API

如何发送行长超过 990 个字符的 csv 附件?