Android附件不会通过电子邮件发送

时间:2012-04-21 11:49:57

标签: android android-intent

我正在开发和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,所以代码看起来更清晰..

事先提出

3 个答案:

答案 0 :(得分: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"));

答案 1 :(得分: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(参见注释行
  • 我还将数据放入电子邮件正文中以检查它是否存在 - &gt;它到达电子邮件
  • 我还尝试将gziped数据放入电子邮件正文中以检查它是否存在 - &gt;它到达了电子邮件中 修改:
  • 尝试从/mnt/system/app/CustomLocale.apk发送模拟器中的预先存在的文件
    23745字节 来自uriLog.getPath()的路径打印为/apk/CustomLocale.apk
    ,邮件仍然带有名为CustomLocale.apk且大小为0KB的附件
    到达 screenshot from emulator

    我发现失败的唯一一件事就是putextra(intent.EXTRA_STREAM,uri)基于

    public Intent putExtra (String name, Parcelable value) 
    

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

  • 答案 2 :(得分:0)

    此代码现在适合我。
    使用createTempFile而不是openFileOutput。我仍然不知道前一种方法有什么问题 它附加了一个名为 LogCat.log.gzip 的文件,这次不是空的,它有我输入的数据。

            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" />