当前位置: 首页 > 面试题库 >

如何通过电子邮件发送已保存的CSV文件或如何通过Android中的Google云端硬盘上传?

瞿健
2023-03-14
问题内容

我有一个简单的日志记录应用程序,可将数据收集到三个数组列表中,我想将其保存到CSV文件中,然后共享给Google云端硬盘,电子邮件等。

这是我保存数据的方式:

StringBuilder data = new StringBuilder();
data.append("Timestamp,Mass,Change in Mass\n");
for(int i = 0; i < mass_list.size(); i++){
      data.append(String.valueOf(timestamp_list.get(i))+ ","+String.valueOf(mass_list.get(i))+","+String.valueOf(mass_roc_list.get(i))+"\n");
      }
FileOutputStream out = openFileOutput("scale.csv", Context.MODE_APPEND );
out.write(data.toString().getBytes());
out.close();

这只是将我的ArrayLists组合成一个字符串,并使用名称比例将数据保存到csv文件中。

这是我尝试分享的方式:

Intent emailIntent = new Intent(Intent.ACTION_SEND);
emailIntent.setType("text/plain");
emailIntent.putExtra(Intent.EXTRA_EMAIL, new String[{"email@gmail.com"});
emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Scale Data");
emailIntent.putExtra(Intent.EXTRA_TEXT, "This is the body");
emailIntent.putExtra(Intent.EXTRA_STREAM, Environment.getExternalStorageDirectory() + "/scale.csv");
startActivity(Intent.createChooser(emailIntent, "Send mail..."));

当我在电子邮件中尝试此操作时,没有附件,只有正文。当我尝试使用Google云端硬盘时,只会将正文保存到文本文件中。我不确定自己在做什么错,但可能与文件位置有关。也许我找不到保存在其中的文件?

我将不胜感激,随时准备根据要求提供澄清。

编辑使用反馈

我尝试了一种建议的解决方案。这是我的代码现在的样子:

    StringBuilder data = new StringBuilder();
    data.append("Timestamp,Mass,Change in Mass\n");
    for(int i = 0; i < mass_list.size(); i++){
        data.append(String.valueOf(timestamp_list.get(i))+ ","+String.valueOf(mass_list.get(i))+","+String.valueOf(mass_roc_list.get(i))+"\n");
    }
    try {
        //saving data to a file
        FileOutputStream out = openFileOutput("scale.csv", Context.MODE_APPEND);
        out.write(data.toString().getBytes());
        out.close();

        Context context = getApplicationContext();
        String filename="/scale.csv";
        File filelocation = new File(Environment.getExternalStorageDirectory().getAbsolutePath(), filename);
        Uri path = FileProvider.getUriForFile(context, "com.example.scaleapp.fileprovider", filelocation);
        Intent emailIntent = new Intent(Intent.ACTION_SEND);
        // set the type to 'email'
        emailIntent.setType("vnd.android.cursor.dir/email");
        String to[] = {"email.com"};
        emailIntent .putExtra(Intent.EXTRA_EMAIL, to);
        emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Scale Data");
        emailIntent.putExtra(Intent.EXTRA_TEXT, "This is the body");
        emailIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
        // the attachment
        emailIntent.putExtra(Intent.EXTRA_STREAM, path);

        //this line is where an exception occurs and "Error" is displayed on my phone
        startActivity(Intent.createChooser(emailIntent, "Send mail..."));

        infoView.setText("Something worked!");
    }
    catch(Exception e){
        e.printStackTrace();
        infoView.setText("Error");
    }

一切都可以编译并正常运行。但是,当我上传到云端硬盘时,它说“无法上传”,当我发送电子邮件时,它说“无法附加空文件”。


问题答案:

res / xml / provider_paths.xml中* 创建一个xml文件 *

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">

    <!--
     name is the file name
     path is the root of external storage, it means here: Environment.getExternalStorageDirectory()
     -->
    <external-path name="scale" path="."/>

    <!--
    another example:  Environment.getExternalStorageDirectory() + File.separator + "temps" + "myFile.pdf"
     -->
    <external-path name="myFile" path="temps"/>

</paths>

清单* 中的应用程序标记中添加提供程序 *

<!--android:name="android.support.v4.content.FileProvider"-->
<provider
    android:name="androidx.core.content.FileProvider"
    android:authorities="your.application.package.fileprovider"
    android:grantUriPermissions="true"
    android:exported="false">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/provider_paths" />
</provider>

最后将代码更改为此:

public static void sendEmailWithAttachment(Context context) {
    String filename="/scale.csv";
    File filelocation = new File(Environment.getExternalStorageDirectory().getAbsolutePath(), filename);
    //Uri path = Uri.fromFile(filelocation);
    Uri path = FileProvider.getUriForFile(context, "your.application.package.fileprovider", filelocation);
    Intent emailIntent = new Intent(Intent.ACTION_SEND);
    // set the type to 'email'
    emailIntent .setType("vnd.android.cursor.dir/email");
    String to[] = {"email@gmail.com"};
    emailIntent .putExtra(Intent.EXTRA_EMAIL, to);
    emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Scale Data");
    emailIntent.putExtra(Intent.EXTRA_TEXT, "This is the body");
    emailIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
    // the attachment
    emailIntent .putExtra(Intent.EXTRA_STREAM, path);
    context.startActivity(Intent.createChooser(emailIntent, "Send mail..."));
}

有关从android文档定义文件路径的一些提示

<files-path name="name" path="path" />

表示Context.getFilesDir()

<cache-path name="name" path="path" />

代表getCacheDir()

<external-path name="name" path="path" />

表示Environment.getExternalStorageDirectory()。

<external-cache-path name="name" path="path" />

表示Context#getExternalFilesDir(String)Context.getExternalFilesDir(null)

<external-media-path name="name" path="path" />

表示Context.getExternalCacheDir()。

阅读更多文档



 类似资料:
  • 问题内容: 在我的中,我具有以下内容: 我的电子邮件代码: 当然,如果通过设置调试服务器,则可以在终端中看到该电子邮件。 但是,我实际上如何不将电子邮件发送到调试服务器,而是发送到user@gmail.com? 阅读你的答案后,让我弄明白一点: 你不能使用localhost(简单的ubuntu pc)发送电子邮件吗? 我认为在django 1.3中已经过时了,取而代之的是? 问题答案: 将电子邮件

  • 我在网上看到了很多代码,但它们似乎都遇到了问题。 使用以下功能创建并保存文件: 然而,当运行下面的代码来发送文件时,我一直遇到问题,并建议使用此链接的所有答案https://stackoverflow.com/questions/48117511/exposed-beyond-app-through-clipdata-item-geturi,当打开Gmail时,它说无法附加文件 如果有任何方法可以

  • 问题内容: 我正在尝试使用 Go通过gmail API 发送电子邮件,但我发现文档存在缺陷/令人困惑。有一次我没有看到收据字段或电子邮件正文。 我不需要上传任何内容,因此我发现简单上传,分段上传,可恢复的上传方法完全没有用。是否有任何清晰的演示(带有所需的数据/参数,例如cURL有效负载)? 顺便提一句,我不确定是否我是唯一一个想到这一点的人,但是除非有可用的库,否则Google api似乎在可用

  • 我被困在一个公司防火墙后面,它不允许我通过Java Mail API或Apache Commons电子邮件等传统方式发送电子邮件,甚至不允许我发送给公司内部的其他人(无论如何,这就是我想要的)。但我的Outlook 2010显然可以发送这些电子邮件。我想知道是否有办法通过Java代码自动化Outlook 2010,以便Outlook可以发送电子邮件?我知道像“mailto”这样的东西可以用来弹出带

  • 请让我知道通过邮件自动发送TestNG可电子邮件报告而不添加外部jar的最佳方式。

  • 以下代码https://stackoverflow.com/a/3649148一直有效,直到最近谷歌改变了他们的安全政策,它才被打破。 我收到了来自谷歌的邮件 你好,xxx,有人刚刚试图登录你的Google帐户xxx@gmail.com来自不符合现代安全标准的应用程序。 我们强烈建议您使用Gmail等安全应用程序访问您的帐户。Google制作的所有应用程序都符合这些安全标准。另一方面,使用不太安全