2016-03-18 23 views
12

Stavo cercando di creare un file per salvare le immagini dalla fotocamera, si scopre che non riesco a creare il file. Ma davvero non riesco a trovare l'errore. Puoi darci un'occhiata e darmi un consiglio?Errore: apertura non riuscita: ENOENT (Nessun file o directory)

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

E ho aggiunto il permesso.

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

Il metodo danno sempre tali errori:

open failed: ENOENT (No such file or directory)

+1

La [esempio dato nel riferimento API] (http://developer.android.com/reference/android/os/Environment.html#getExternalStoragePublicDirectory (java. lang.String)) ha questa linea: '// Assicurati che la cartella Pictures esista. path.mkdirs(); '. Sei sicuro che la directory esista già? –

+0

Prova questo link: [Android canvas save always 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

Grazie! Nell'allenamento non c'è un suggerimento. Avrei dovuto cercare i riferimenti API. Grazie! –

risposta

19

La directory immagini potrebbero non esistere ancora. Non è garantito essere lì.

Nel the API documentation for getExternalStoragePublicDirectory(), il codice garantisce la directory esiste utilizzando mkdirs:

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

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

... quindi potrebbe essere semplice come l'aggiunta che path.mkdirs() al codice esistente prima di createTempFile.

0

Prova questa:

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

Sostituire:

Environment.getExternalStoragePublicDirectory(
       Environment.DIRECTORY_PICTURES) 

Con:

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

assicuratevi di chiamare:

mkdirs() // and not mkdir() 

Ecco il codice che dovrebbe funzionare per voi:

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

Ho avuto una brutta esperienza seguendo l'esempio dato in Android Studio Documentation e ho scoperto che ci sono molti altri vivendo lo stesso su questo argomento particolare qui a StackOverflow, è perché anche se abbiamo impostato

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

il problema persiste in alcuni dispositivi.

La mia esperienza è stata che l'esempio ha funzionato quando l'ho provato in modalità di debug, dopo altri 3 test è accaduto che il mio SD fosse improvvisamente danneggiato, ma non penso che abbia a che fare con il loro esempio (divertente) . Ho acquistato una nuova scheda SD e l'ho provata di nuovo, solo per rendermi conto che ancora sia la modalità di rilascio che quella di debug hanno fatto lo stesso log degli errori: la directory non esiste ENOENT. Alla fine, ho dovuto creare le directory che contengono le immagini catturate dalla fotocamera del mio telefono. E avevo ragione, funziona perfettamente.

Spero che questo aiuti voi e gli altri là fuori a cercare risposte.

0

Ho usato contentResolver con l'URI e ha funzionato per me. Ho visto in un altro post SO che non riesco a trovare.

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

spero che aiuti ....

0

ho risolto così:

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