Android Studio:表单数据CSV/PDF格式邮件发送故障排查
解决安卓表单数据通过CSV邮件发送的问题
哥们,我一眼就瞅出问题所在了——你当前的代码里生成CSV用的是硬编码的模拟数据(Time和Distance那部分循环),完全没去读取用户在EditText和CheckBox里填的内容!这就是为啥邮件能发,但附件里没有表单数据的原因。下面给你一步步修正:
核心修改思路
- 从表单控件中读取用户实际输入的姓名、年龄、性别、地址、电话
- 构建和表单字段匹配的CSV内容
- 保留原本可用的文件保存与邮件发送逻辑
修改后的完整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); } } }
额外补充说明
- CheckBox单选逻辑:我给你补上了
onCheckboxClicked方法,实现性别单选——选中一个时自动取消另一个,避免用户多选导致数据混乱。 - 空值处理:给每个字段都加了空值判断,避免用户未填写时出现空字符串或空指针问题。
- FileProvider配置:你现有的
Provider_paths.xml配置是正确的,无需修改,确保AndroidManifest.xml里已经注册了FileProvider(你之前能发邮件,应该已经配置好了)。
如果之后还要尝试用iText生成PDF发送,思路是类似的:
- 用iText创建PDF文档,将表单数据写入段落或表格
- 把PDF保存到本地文件
- 复用当前的邮件发送逻辑,将PDF作为附件发送
内容的提问来源于stack exchange,提问作者user9919669
相关产品推荐
相关产品推荐

