我的应用程序在手机的SD卡上创建了一个目录名,并在其中存储了一堆图像。该代码适用于大多数用户,但有些报告错误保存文件。
以下是创建目录的代码: R.string.dir设置为“/ appname /”
dir = Environment.getExternalStorageDirectory() + ((String) getResources().getText(R.string.dir));
if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())){
File fDir = new File(dir);
fDir.mkdirs();
}
else{
showToast(false,"This Application needs a mounted external storage (sdcard).");
finish();
}
所以此时应该创建目录(它最终是/ mnt / sdcard / appname),或者应用程序完成。
但是,在尝试保存文件时,某些用户报告此异常:
Msg:java.io.FileNotFoundException:/mnt/sdcard/appname/file.jpg(没有这样的文件或目录)
执行保存的代码:
File file = new File("/mnt/sdcard/appname/file.jpg");
FileOutputStream fos = null;
try {
fos = new FileOutputStream( file );
b.compress(Bitmap.CompressFormat.JPEG, 100, fos );
}
catch( Exception e ) {
有什么建议吗?可能是mkdirs()返回false(如果已经创建了目录,它会这样做,但那时我应该能够在那里写入文件)?如果安装了SD卡,它会返回false的另一个原因是什么?我怎样才能更好地处理这个?
是的,我们使用的是唯一的文件名(附加 System.currentTimeMillis()到文件名)。流也在最后关闭
finally
{
if(fos != null) {
try {
fos.close();
}
catch(Exception ex){
ex.printStackTrace();
}
}
答案 0 :(得分:4)
您假设(在第二个代码示例中)所有设备中的SD卡路径为/mnt/sdcard/
。这是一个错误的假设。你应该致电Environment.getExternalStorageDirectory以获得正确的路径。
此外,可能是目录但不是文件,在打开输出流之前添加以下代码:
if (!file.exists()) {
file.createNewFile();
}
答案 1 :(得分:0)
总结其他帖子在这里的方向是一些潜在的问题
修改后考虑到这些可能应该看起来更像这个
String sdCard = Environment.getExternalStorageDirectory() + ((String) getResources().getText(R.string.dir));
File file = new File(sdCard + "/appname/file.jpg"); // DO YOU WANT YOUR APP NAME OR JUST APPNAME ???
if (file.exists()) // if the jpg already exists --- problems
file.delete();
FileOutputStream fos = null;
try {
fos = new FileOutputStream(file.getPath());
b.compress(Bitmap.CompressFormat.JPEG, 100, fos );
fos.close();
}
catch( Exception e ) { ... }
除此之外还可能存在其他潜在问题。如果用户将设备连接到USB并设置为硬盘驱动器,则无法访问SD卡,则SD卡可能是只读的,用户可能没有SD卡(您正在检查,因此将其与之交叉)< / p>