You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Studio:表单数据CSV/PDF格式邮件发送故障排查

解决安卓表单数据通过CSV邮件发送的问题

哥们,我一眼就瞅出问题所在了——你当前的代码里生成CSV用的是硬编码的模拟数据(Time和Distance那部分循环),完全没去读取用户在EditText和CheckBox里填的内容!这就是为啥邮件能发,但附件里没有表单数据的原因。下面给你一步步修正:

核心修改思路

  1. 从表单控件中读取用户实际输入的姓名、年龄、性别、地址、电话
  2. 构建和表单字段匹配的CSV内容
  3. 保留原本可用的文件保存与邮件发送逻辑

修改后的完整MainActivity代码

import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.FileProvider;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.CheckBox;
import android.widget.EditText;
import java.io.File;
import java.io.FileOutputStream;

public class MainActivity extends AppCompatActivity {

    private CheckBox cbMale, cbFemale;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // 提前初始化CheckBox,避免点击事件里重复findViewById
        cbMale = findViewById(R.id.checkBox);
        cbFemale = findViewById(R.id.checkBox2);
    }

    public void export(View view) {
        // 1. 获取所有表单控件的实例
        EditText etName = findViewById(R.id.editText);
        EditText etAge = findViewById(R.id.editText2);
        EditText etAddress = findViewById(R.id.editText3);
        EditText etPhone = findViewById(R.id.editText4);

        // 2. 提取用户输入的内容,处理空值
        String name = etName.getText().toString().trim().isEmpty() ? "未填写" : etName.getText().toString().trim();
        String age = etAge.getText().toString().trim().isEmpty() ? "未填写" : etAge.getText().toString().trim();
        String gender = "";
        if (cbMale.isChecked()) {
            gender = "男";
        } else if (cbFemale.isChecked()) {
            gender = "女";
        } else {
            gender = "未选择";
        }
        String address = etAddress.getText().toString().trim().isEmpty() ? "未填写" : etAddress.getText().toString().trim();
        String phone = etPhone.getText().toString().trim().isEmpty() ? "未填写" : etPhone.getText().toString().trim();

        // 3. 构建正确的CSV数据
        StringBuilder data = new StringBuilder();
        // CSV表头
        data.append("姓名,年龄,性别,地址,电话\n");
        // 写入用户数据
        data.append(String.format("%s,%s,%s,%s,%s", name, age, gender, address, phone));

        try {
            // 保存文件到设备
            FileOutputStream out = openFileOutput("data.csv", Context.MODE_PRIVATE);
            out.write((data.toString()).getBytes());
            out.close();

            // 发送邮件逻辑(这部分你原本的代码是对的,保留即可)
            Context context = getApplicationContext();
            File filelocation = new File(getFilesDir(), "data.csv");
            Uri path = FileProvider.getUriForFile(context, "com.example.exportcsv.fileprovider", filelocation);
            Intent fileIntent = new Intent(Intent.ACTION_SEND);
            fileIntent.setType("text/csv");
            fileIntent.putExtra(Intent.EXTRA_SUBJECT, "用户表单数据");
            fileIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            fileIntent.putExtra(Intent.EXTRA_STREAM, path);
            startActivity(Intent.createChooser(fileIntent, "选择邮件应用发送"));

        } catch(Exception e) {
            e.printStackTrace();
        }
    }

    // 补充布局里绑定的CheckBox点击事件,实现单选逻辑
    public void onCheckboxClicked(View view) {
        CheckBox clickedCb = (CheckBox) view;
        if (clickedCb.getId() == R.id.checkBox) {
            cbFemale.setChecked(false);
        } else if (clickedCb.getId() == R.id.checkBox2) {
            cbMale.setChecked(false);
        }
    }
}

额外补充说明

  1. CheckBox单选逻辑:我给你补上了onCheckboxClicked方法,实现性别单选——选中一个时自动取消另一个,避免用户多选导致数据混乱。
  2. 空值处理:给每个字段都加了空值判断,避免用户未填写时出现空字符串或空指针问题。
  3. FileProvider配置:你现有的Provider_paths.xml配置是正确的,无需修改,确保AndroidManifest.xml里已经注册了FileProvider(你之前能发邮件,应该已经配置好了)。

如果之后还要尝试用iText生成PDF发送,思路是类似的:

  • 用iText创建PDF文档,将表单数据写入段落或表格
  • 把PDF保存到本地文件
  • 复用当前的邮件发送逻辑,将PDF作为附件发送

内容的提问来源于stack exchange,提问作者user9919669

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 09:22:27