我想这是一个愚蠢的错误,但我在这里无法自拔...... 这是我的第一个Android应用程序。我正在尝试在模拟的SD卡上保存一些数据,以便用户可以轻松检索数据。
这个类应该将一些DataField写入sd-card
private final List<DataField> dataFields;
private final File exportFile;
private DateFormat simpleDate = new SimpleDateFormat("yyyyMMddhhmm");
private CsvExporter(List<DataField> dataFields) {
this.dataFields = dataFields;
exportFile = new File(getTargetFolderPath(), getTargetFileName());
}
private String getTargetFileName() {
return "export_" + (simpleDate.format(new Date())) + ".csv";
}
private File getTargetFolderPath() {
//return Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
File targetFolder = getExternalFilesDir(null);
if (!targetFolder.exists()){
if (!targetFolder.mkdirs()){
Log.e("CsvWriter","Could not create targetFolder " + targetFolder);
}}
Log.d("CsvWriter","TargetFolder is " + targetFolder);
for (File f: targetFolder.listFiles()){
Log.d("CsvWriter","Found file " + f);
}
return targetFolder;
}
private void initFile() throws IOException {
if (!exportFile.exists()) {
if (!exportFile.createNewFile()){
Log.e("CsvWriter","Could not create targetFile " +exportFile);
}
}
Log.d("CsvWriter","targetFile is " +exportFile);
}
public File doExport() {
try {
initFile();
List<String[]> data = convertToStrings();
writeData(data);
readData();
return exportFile;
} catch (IOException e) {
throw new RuntimeException("Unable to create or write to csv-File", e);
}
}
我在华硕平板电脑上调试应用程序。到目前为止一切正常。该文件夹是第一次创建的,现在确实存在。该文件已写入,也可以以编程方式读取。如果我用android设备监视器打开设备,我可以看到文件/mnt/shell/emulated/0/Android/data/my.package.name/files/。 这是完全可以预料的,我很高兴这次运行如此顺利。 然而,当我在我的电脑上安装android-device时,我的文件夹在/Android/data/my.package.name/files
下不可见我的AndroidManifest.xml中包含android.permission.WRITE_EXTERNAL_STORAGE
您可以看到一种不同的方法,我选择下载文件夹作为目标。再次,我可以使用android设备监视器(/ shell / emulated / 0 / Download /)浏览目录树时看到文件,但是当我打开设备上的下载文件夹时,我无法看到文件。
我做错了什么?是不是getExternalFilesDir应该返回一个可见的文件夹?
编辑: 这是我的adm和我的文件浏览器的截图...
EDIT2: 我解决了这个问题。谢谢 :) 固定的doExport():
public File doExport() {
try {
initFile();
List<String[]> data = convertToStrings();
writeData(data);
sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://" + getTargetFolderPath())));
//readData();
return exportFile;
} catch (IOException e) {
throw new RuntimeException("Unable to create or write to csv-File", e);
}
}
我强烈建议您阅读this question
答案 0 :(得分:4)
Isnt getExternalFilesDir应该返回一个可见的文件夹吗?
是的,但只有在文件夹中的文件被MediaStore
编入索引之后。您可以使用MediaScannerConnection
and scanFile()
请求对其编制索引。