尝试从android访问SD卡时出现IOException

时间:2011-03-30 03:06:22

标签: android filenotfoundexception android-sdcard

大家。我正在尝试将带有android的图片保存到SD卡上的公共图片目录中。但是,我似乎无法打开文件进行写作。这是代码:

                boolean mExternalStorageWriteable = false;
            String state = Environment.getExternalStorageState();

            if (Environment.MEDIA_MOUNTED.equals(state)) {

               mExternalStorageWriteable = true;
            } 

            if(mExternalStorageWriteable){
                    File root_dir = Environment.getExternalStorageDirectory();
                    root_dir.mkdirs();
                    File pictures_directory = new File(root_dir, "/Pictures/");
                    pictures_directory.mkdirs();
                    File outputfile = new File(pictures_directory, "test_file.jpg");
                    try {
                        outputfile.createNewFile();
                        FileOutputStream out = new FileOutputStream(outputfile);
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
            }


我的调试器总是跳转到catch块(由createNewFile调用引起),IOExceptions消息是“Not a Directory”。如果我删除createNewFile调用,FileOutPutStream构造函数将抛出FileNotFound异常。打开文件输出流到文件系统的根目录或图片目录似乎工作正常。

为了免除显而易见的,我的清单包括< uses-permission android:name =“android.permission.WRITE_EXTERNAL_STORAGE”/>标签。我正在使用API​​级别5,我的模拟器安装了一个虚拟SD卡。非常感谢任何建议。

已解决:模拟器文件系统出现问题。 DDMS显示/ Pictures /由于某种原因被创建为文件或目录。创建新的模拟器解决了这个问题。

3 个答案:

答案 0 :(得分:3)

对于硬编码器路径分隔符来说,这通常是一种糟糕的方式。只需Pictures而不是/Pictures/。最后一个是指向root中文件夹的绝对路径:

File pictures_directory = new File(root_dir, "Pictures");

UPD:

我已编译并运行您的代码段,没有任何问题。所以问题出在你的模拟器文件系统中。尝试首先删除该图片文件,或者甚至为您的模拟器创建一个新的SD卡图像。

答案 1 :(得分:0)

您混淆了以下两种方法:

File(String Path)File(File dir, String name)

因此,pictures_directory应该是一个目录而不是一个完整的路径+文件名。

尝试更改

File pictures_directory = new File(root_dir, "/Pictures/");

File pictures_directory = new File(root_dir + "/Pictures/");

答案 2 :(得分:0)

试试这个方法。确保res / drawable目录中有test_file.jpg。

    private void writeToSDCard() {
    try {
        File root = Environment.getExternalStorageDirectory();

        if (root.canWrite()){
            InputStream from = getBaseContext().getResources().openRawResource(R.drawable.test_file);
            File dir = new java.io.File (root, "Pictures");
            dir.mkdir();
            File writeTo = new File(root, "Pictures/test_file.jpg");
            FileOutputStream  to = new FileOutputStream(writeTo);

            byte[] buffer = new byte[4096];
            int bytesRead;

            while ((bytesRead = from.read(buffer)) != -1)
                to.write(buffer, 0, bytesRead); // write
            to.close();             
            from.close();
        } else {
            Log.d("MyActivity", "Unable to access SD card.");
        }
    } catch (Exception e) {
        Log.d("MyActivity", "writeToSDCard: " + e.getMessage());
    }
}   "