Android App创建目录适用于大多数但是无法在sdcard上创建许多目录的错误

时间:2011-07-12 21:21:20

标签: android file save sd-card android-sdcard

我的应用程序在手机的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();

        }

        }

2 个答案:

答案 0 :(得分:4)

您假设(在第二个代码示例中)所有设备中的SD卡路径为/mnt/sdcard/。这是一个错误的假设。你应该致电Environment.getExternalStorageDirectory以获得正确的路径。

此外,可能是目录但不是文件,在打开输出流之前添加以下代码:

if (!file.exists()) {
    file.createNewFile();
}

答案 1 :(得分:0)

总结其他帖子在这里的方向是一些潜在的问题

  1. 第一种和第二种方法中的名称不同(或者它们可能是,不知道)
  2. 由于您正在对名称进行硬编码,因此该文件可能已存在
  3. 您没有关闭流
  4. 你说资源中的字符串设置为/ appname /希望你的意思是你的应用程序名称,很多人可能会使用文字appname和file.jpg来存储东西,因为它出现在很多教程中等等。
  5. 修改后考虑到这些可能应该看起来更像这个

        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>