错误:打开失败:ENOENT(没有这样的文件或目录)

我试图创build一个文件来保存照相机的图片,事实certificate,我不能创build该文件。 但我真的找不到这个错误。 你可以看看,给我一些build议吗?

private File createImageFile(){ File imageFile=null; String stamp=new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); File dir= Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES); String imageFileName="JPEG_"+stamp+"_"; try { imageFile=File.createTempFile(imageFileName,".jpg",dir); } catch (IOException e) { Log.d("YJW",e.getMessage()); } return imageFile; } 

我已经添加了权限。

 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 

该方法总是给出这样的错误:

打开失败:ENOENT(没有这样的文件或目录)

Solutions Collecting From Web of "错误:打开失败:ENOENT(没有这样的文件或目录)"

图片目录可能还不存在。 不保证在那里。

getExternalStoragePublicDirectory()的API文档中 ,代码确保使用mkdirs的目录存在:

 File path = Environment.getExternalStoragePublicDirectory( Environment.DIRECTORY_PICTURES); File file = new File(path, "DemoPicture.jpg"); try { // Make sure the Pictures directory exists. path.mkdirs(); 

…所以它可能就像在createTempFile之前将path.mkdirs()添加到现有代码一样简单。

尝试这个:

 private File createImageFile() throws IOException { String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); String imageFileName="JPEG_"+stamp+".jpg"; File photo = new File(Environment.getExternalStorageDirectory(), imageFileName); return photo; } 

更换:

 Environment.getExternalStoragePublicDirectory( Environment.DIRECTORY_PICTURES) 

附:

 private File createImageFile() throws IOException { // Create an image file name 

确保你打电话给:

 mkdirs() // and not mkdir() 

以下是适合您的代码:

  String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); String imageFileName = "JPEG_" + timeStamp + "_"; File storageDir = new File(Environment.getExternalStorageDirectory().toString(), "whatever_directory_existing_or_not/sub_dir_if_needed/"); storageDir.mkdirs(); // make sure you call mkdirs() and not mkdir() File image = File.createTempFile( imageFileName, // prefix ".jpg", // suffix storageDir // directory ); // Save a file: path for use with ACTION_VIEW intents mCurrentPhotoPath = "file:" + image.getAbsolutePath(); Log.e("our file", image.toString()); return image; } 

在Android Studio文档中给出的例子中,我遇到了一些不好的经历,我发现在这里有很多其他的东西在stackoverflow中遇到这个问题,那是因为即使我们设置了

 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 

这个问题在一些设备上依然存在。

我的经验是,当我在debugging模式下使用这个例子的时候,这个例子很有用,在那之后又发生了3次testing,我的SD突然被破坏了,但是我不认为它和他们的例子有关。 我买了一个新的SD卡,并尝试了一遍,才意识到仍然释放和debugging模式做了相同的错误日志:目录不存在ENOENT。 最后,我必须创build自己的目录,包含从手机相机拍摄的照片。 而我是对的,它运作得很完美。

我希望这可以帮助你和其他人寻找答案。

我用URI的contentResolver,它为我工作。 看到另一个SOpost,我找不到。

 private String getRealPathFromURI(Uri contentURI) { String result; Cursor cursor = getContentResolver().query(contentURI, null, null, null, null); if (cursor == null) { result = contentURI.getPath(); } else { cursor.moveToFirst(); int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA); result = cursor.getString(idx); cursor.close(); } return result; } 

希望能帮助到你….

我已经解决了这个问题:

  public Intent getImageCaptureIntent(File mFile) { Intent mIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); Uri photoURI = FileProvider.getUriForFile(this, BuildConfig.APPLICATION_ID + ".provider", mFile); mIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI); // The tip is this code below List<ResolveInfo> resInfoList = getPackageManager().queryIntentActivities(mIntent, PackageManager.MATCH_DEFAULT_ONLY); for (ResolveInfo resolveInfo : resInfoList) { String packageName = resolveInfo.activityInfo.packageName; grantUriPermission(packageName, photoURI, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION); } return mIntent; }