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,所以代码看起来更干净..

提前致谢

4

3 回答 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" />
于 2012-05-11T12:48:44.860 回答
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"));
于 2012-04-21T11:53:47.953 回答
0

我有完全一样的问题。因此,不要重复同一篇文章,我想向您展示我的代码,这与您的代码略有不同,但仍会发送一封带有 0KB 附件的电子邮件。
我在日志中打印 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:它不是 null 并且包含正确的路径。

    代码是:

            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(见注释行
  • 我还将数据放在电子邮件正文中以检查它是否存在 --> 它到达电子邮件中
  • 我还尝试将压缩后的数据放入电子邮件正文中以检查它是否存在 --> 它到达了电子邮件
    编辑:
  • 试图从 /mnt/system/app/CustomLocale.apk 发送一个预先存在的文件,从 /mnt/system/app/CustomLocale.apk
    23745 字节 uriLog.getPath() 的路径被打印 /apk/CustomLocale.apk
    并且邮件仍然带有一个名为的附件CustomLocale.apk 和 0KB 大小
    模拟器截图

    我唯一想到的失败是 putextra(intent.EXTRA_STREAM,uri) 是基于

    public Intent putExtra (String name, Parcelable value) 
    

    uris实现了parcelable 接口。但是由于某种原因,我将调查,也许对writeToParcel(Parcel out, int flags)的调用没有将文件数据写出;这就是为什么它在附件中是 0KB 的原因。

  • 于 2012-05-11T08:53:46.033 回答