2016-03-18 5 views
12

Я пытался создать файл для сохранения фотографий с камеры, оказалось, что я не могу создать файл. Но я действительно не могу найти ошибку. Можете ли вы взглянуть на нее и дать мне несколько советов?Ошибка: open failed: ENOENT (Нет такого файла или каталога)

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"/> 

метод всегда дает такие ошибки:

open failed: ENOENT (No such file or directory)

+1

В [пример, приведенный в ссылке API] (http://developer.android.com/reference/android/os/Environment.html#getExternalStoragePublicDirectory (Java. lang.String)) имеет следующую строку: '// Убедитесь, что каталог Pictures существует. path.mkdirs(); '. Вы уверены, что каталог уже существует? –

+0

Попробуйте эту ссылку: [canvas canvas сохранить всегда java.io.IOException: open failed: ENOENT] (http://stackoverflow.com/questions/18605440/android-canvas-save-always-java-io-ioexception-open- failed-enoent-no-such-fil) –

+0

Спасибо! В тренинге нет такого намека. Я должен был искать ссылки API. Благодаря! –

ответ

19

каталог изображений не может еще существовать. Там не гарантировано.

the API documentation for getExternalStoragePublicDirectory() В код обеспечивает каталог существует с помощью mkdirs:

File path = Environment.getExternalStoragePublicDirectory(
     Environment.DIRECTORY_PICTURES); 
File file = new File(path, "DemoPicture.jpg"); 

try { 
    // Make sure the Pictures directory exists. 
    path.mkdirs(); 

... так что это может быть столь же просто, как добавить, что path.mkdirs() в существующий код перед вами createTempFile.

0

Попробуйте это:

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; 
} 
1

Заменить:

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 Documentation, и я узнал, что есть много других, которые испытывают то же самое об этой конкретной теме здесь, в StackOverflow, это потому, что даже если мы устанавливаем

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

проблема сохраняется в некоторых устройствах.

Мой опыт был в том, что этот пример работал, когда я попробовал его в режиме отладки, после этого еще 3 теста так случилось, что мой SD внезапно был поврежден, но я не думаю, что он имеет отношение к их примеру (смешно) , Я купил новую SD-карту и попробовал ее еще раз, только чтобы понять, что оба режима выпуска и отладки выполняли один и тот же журнал ошибок: каталог не существует ENOENT. Наконец, я должен был создать каталоги, в которых каждый из них будет содержать снятые снимки с камеры моего телефона. И я был прав, он работает просто отлично.

Я надеюсь, что это поможет вам и другим людям найти ответы.

0

Я использовал contentResolver с URI, и это сработало для меня. Увидел его в другом столбце, который я не могу найти.

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; 
} 

надеюсь, что это поможет ....

0

Я решил так:

 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; 
     } 
Смежные вопросы