Android应用程序创建目录适用于大多数应用程序,但在许多应用程序上出现无法在SD卡上创建目录的错误

Android应用程序创建目录适用于大多数应用程序,但在许多应用程序上出现无法在SD卡上创建目录的错误,android,file,save,sd-card,android-sdcard,Android,File,Save,Sd Card,Android Sdcard,我的应用程序在手机的sd卡上创建了一个目录名,并在其中存储了一组图像。这段代码对大多数用户来说运行良好,但有些用户在保存文件时报告了错误 以下是创建目录的代码: R.string.dir设置为“/appname/” 因此,此时应创建目录(最终为/mnt/sdcard/appname),否则应用程序将完成 但是,在尝试保存文件时,有些用户报告了此异常: Msg:java.io.FileNotFoundException:/mnt/sdcard/appname/file.jpg(无此类文件或目录)

我的应用程序在手机的sd卡上创建了一个目录名,并在其中存储了一组图像。这段代码对大多数用户来说运行良好,但有些用户在保存文件时报告了错误

以下是创建目录的代码: R.string.dir设置为“/appname/”

因此,此时应创建目录(最终为/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(如果已经创建了目录,则会返回false,但我应该能够在其中写入文件)?如果SD卡已安装,它返回false的另一个原因是什么?我怎样才能处理得更好


是,我们正在使用唯一的文件名(附加 将System.currentTimeMillis()转换为文件名)。此外,流在末端关闭

        finally
        {

        if(fos != null) {

        try {

        fos.close();

        }
        catch(Exception ex){

        ex.printStackTrace();

        }

        }
假设(在第二个代码示例中)所有设备中的SD卡路径都是
/mnt/sdcard/
。这是一个错误的假设。你应该打电话找到正确的路径

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

if (!file.exists()) {
    file.createNewFile();
}
假设(在第二个代码示例中)所有设备中的SD卡路径都是
/mnt/sdcard/
。这是一个错误的假设。你应该打电话找到正确的路径

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

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

总结一下其他帖子的发展方向,这里有一些潜在的问题

  • 第一个和第二个方法中的名称不相同(或者可能是,不知道)
  • 由于您正在硬编码一个名称,该文件可能已经存在
  • 您没有关闭流
  • 您说过资源中的字符串设置为/appname/希望您指的是您的应用程序名称,很多人可能会使用文字appname和file.jpg来存储内容,因为这在很多教程中都会出现
  • 考虑到这些因素进行了修改,它可能看起来更像这样

        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卡可能是只读的,用户可能没有SD卡(您正在检查该SD卡,以便将其划掉)

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

  • 第一个和第二个方法中的名称不相同(或者可能是,不知道)
  • 由于您正在硬编码一个名称,该文件可能已经存在
  • 您没有关闭流
  • 您说过资源中的字符串设置为/appname/希望您指的是您的应用程序名称,很多人可能会使用文字appname和file.jpg来存储内容,因为这在很多教程中都会出现
  • 考虑到这些因素进行了修改,它可能看起来更像这样

        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卡可能是只读的,用户可能没有SD卡(您正在检查该SD卡,以便将其划掉)

    请在粘贴代码时相应地格式化源代码。欢迎来到SO。你检查过这张卡是否可能以只读方式挂载吗?公民康涅狄格州:这是我的第一篇帖子,不确定我的代码是否已经被编辑过,或者我是否应该进一步编辑它以修复某些问题。有没有我错过的关于我们应该如何在发布之前格式化代码的页面?请在粘贴代码时相应地格式化您的源代码。欢迎来到SO。你检查过这张卡是否可能以只读方式挂载吗?公民康涅狄格州:这是我的第一篇帖子,不确定我的代码是否已经被编辑过,或者我是否应该进一步编辑它以修复某些问题。在发布之前,是否有一个页面包含我错过的关于我们应该如何格式化代码的信息?您错过了代码中上面的dir=Environment.getExternalStorageDirectory吗?@jetson您是否也在文件创建代码中使用Environment.getExternalStorageDirectory调用?不,这是第一个示例。查看save file示例:
    file file=new file(“/mnt/sdcard/appname/file.jpg”)也许这是徒劳的?愚蠢的事情,我怎么做一个马车返回没有使其张贴,即这里的引语“没有什么合法的,你可以做这件事-原始设备制造商是在骗你。”因此,如果我们不能真正得到'真实'的位置,没有多少可以做的权利?也许。仍然要保持一致,如果在第一种方法中以一种方式获得路径,那么在第二种方法中以相同的方式获得路径。。。因为这可能是OEM的错误,但也可能是您的错误…您是否错过了上面代码中的dir=Environment.getExternalStorageDirectory?@jetson您是否也在文件创建代码中使用Environment.getExternalStorageDirectory调用?不,这是第一个示例。查看save file示例:
    file file=new file(“/mnt/sdcard/appname/file.jpg”)也许这是徒劳的?愚蠢的事情,我怎么做一个马车返回没有使其张贴,即这里的引语“没有什么合法的,你可以做这件事-原始设备制造商是在骗你。”因此,如果我们不能真正得到'真实'的位置,没有多少可以做的权利?也许。仍然要保持一致,如果在第一种方法中以一种方式获得路径,那么在第二种方法中以相同的方式获得路径。。。因为这可能是OEM的错误,但也可能是你的错误…粘贴的代码中没有包含用于获取实际“appname”等的额外代码…似乎主要问题是Android手机/OEM之间的差异