Android读取指定路径CSV文件无报错但不显示内容问题求助
Android外部存储CSV读取无内容问题排查与解决
问题分析
读取外部存储CSV无报错但不显示内容,而Assets目录文件可正常加载,大概率是权限缺失、路径错误或代码逻辑漏洞导致,以下是针对性解决步骤:
1. 补全存储权限(核心原因)
Android 6.0(API 23)及以上,仅Manifest静态权限不足以访问外部存储,需动态申请:
- 添加静态权限到AndroidManifest.xml
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <!-- Android 13+无需WRITE权限,低版本可保留 --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
- 动态申请权限并执行读取逻辑
将读取CSV的代码封装为方法,权限通过后调用:
// 检查权限 if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 100); } else { readCsvFile(); } // 权限回调处理 @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == 100) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { readCsvFile(); } else { Toast.makeText(this, "需要存储权限才能加载CSV文件", Toast.LENGTH_SHORT).show(); } } }
2. 验证文件路径有效性
Environment.getExternalStorageDirectory()在Android 10(API 29)及以上已废弃,直接拼接路径可能找不到文件:
- 读取前检查文件是否存在
File sdCard = Environment.getExternalStorageDirectory(); File dir = new File(sdCard.getAbsolutePath() + "/dl"); File cert = new File(dir,"m.csv"); if (!cert.exists()) { Log.d("iii", "文件不存在,路径:" + cert.getAbsolutePath()); return; }
- 改用API推荐路径(API 29+无需动态权限)
// 应用私有外部存储目录 File dir = getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS); File cert = new File(dir, "m.csv");
3. 修正代码逻辑漏洞
原代码存在变量覆盖、对象重复引用问题,导致显示异常:
- 每次循环覆盖
s变量,最终仅显示最后一个token内容; - 重复添加同一个
dt对象到列表,导致数据全部重复。
修改后的读取逻辑:
private void readCsvFile() { try { File sdCard = Environment.getExternalStorageDirectory(); File dir = new File(sdCard.getAbsolutePath() + "/dl"); File cert = new File(dir,"m.csv"); if (!cert.exists()) { Log.d("iii", "文件不存在:" + cert.getAbsolutePath()); return; } InputStream sl = new BufferedInputStream(new FileInputStream(cert)); BufferedReader reader=new BufferedReader(new InputStreamReader(sl,Charset.forName("UTF-8"))); String line=""; while((line=reader.readLine())!=null){ String[] token = line.split(","); StringBuilder contentSb = new StringBuilder(); for(int i=0;i<token.length;i++){ contentSb.append(token[i]).append("-"); if(token[i].length()>15){ contentSb.append("---"); } } String showText = contentSb.toString() + "token lrn" + token.length; tv.setText(showText); // 创建新对象添加到列表,避免重复引用 WeatherData newDt = new WeatherData(); // 替换为你的自定义类 newDt.sets2(contentSb.toString()); weathersam.add(newDt); } reader.close(); sl.close(); }catch(Exception e){ Log.d("iii", e.getClass().getSimpleName() + ": " + e.getMessage()); } }
内容的提问来源于stack exchange,提问作者imna
相关产品推荐
相关产品推荐

