为什么Environment.getExternalStoragePublicDirectory在某些设备中不起作用(自2011年初开始特别制造)?

时间:2015-03-12 08:08:24

标签: android file storage

我正在尝试将从相机捕获的图像存储到公共存储目录,这是我存储图像的代码部分:

protected File createImageFile() throws IOException {
        // Create an image file name
        String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
        String imageFileName = "JPEG_" + timeStamp + "_";
        File storageDir = Environment.getExternalStoragePublicDirectory(
                Environment.DIRECTORY_PICTURES);
        File image = File.createTempFile(
                imageFileName,  /* prefix */
                ".jpg",         /* suffix */
                storageDir      /* directory */
                );
        return image;
    }

它在大多数设备上工作正常,但在某些设备中我得到了

  

java.io.IOException:open failed:ENOENT(没有这样的文件或目录)

所以我的问题是为什么同一段代码在大多数设备中工作正常,为什么不在某些设备中以及如何解决这个问题呢?

3 个答案:

答案 0 :(得分:1)

改为使用context.getExternalFilesDir(Environment.DIRECTORY_PICTURES)

答案 1 :(得分:1)

如果您将图像存储在公共目录中,我想这是因为您希望与其他应用共享这些图像。 您需要问自己以下问题:“我是否希望我的应用生成的这些文件能够在我的应用程序被卸载后继续存在?” 如果答案是(我建议),则应使用Context.getExternalMediaDirs()代替。对于API 19及更高版本,这些目录不需要存储权限!

如果答案是(O_o),则应使用Environment.getExternalStorageDirectory()Environment.getExternalStoragePublicDirectory(String)。这些总是需要存储权限。 此外,正如您已经经历过的和其他人指出的那样,这些目录可能尚不存在。请查看API documentation以获取更多信息,但简而言之,您应该先致电paths.mkdirs()以确保目录存在。

答案 2 :(得分:0)

你可以使用

File storageDir = new File("/mnt/extSdCard/Pictures")

File storageDir =new File("/mnt/external_sd/Pictures")

当然最好先使用此代码检查目录:

if(storageDir.isDirectory())