2016-03-18 14 views
12

मैं कैमरे से चित्रों को सहेजने के लिए एक फ़ाइल बनाने की कोशिश कर रहा था, यह पता चला कि मैं फ़ाइल नहीं बना सकता। लेकिन मुझे वास्तव में गलती नहीं मिल रही है। क्या आप इसे देख सकते हैं और मुझे कुछ सलाह दे सकते हैं?त्रुटि: खुला असफल: 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 (जावा। lang.String)) में यह पंक्ति है: '// सुनिश्चित करें कि चित्र निर्देशिका मौजूद है। path.mkdirs(); '। क्या आप वाकई निर्देशिका पहले से मौजूद हैं? –

+0

इस लिंक को आजमाएं: [एंड्रॉइड कैनवास हमेशा java.io.IOException को बचाएं: खुला असफल: ENOENT] (http://stackoverflow.com/questions/18605440/android-canvas-save-always-java-io-ioexception-open- असफल-enoent-no-like-fil) –

+0

धन्यवाद! प्रशिक्षण में ऐसा संकेत नहीं है। मुझे एपीआई संदर्भों की खोज करनी चाहिए थी। धन्यवाद! –

उत्तर

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 

सुनिश्चित करें कि आप कॉल करें:

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

mkdirs() // and not mkdir() 

यहाँ कोड है कि आप के लिए काम करना चाहिए है

मैं उदाहरण का पालन करना एक बुरा अनुभव Android Studio Documentation में दी गई थी और मुझे पता चला कई अन्य लोगों के stackoverflow में इस विशेष विषय के बारे में यहाँ एक ही सामना कर रहा है कि है, क्योंकि हम सेट करने के बावजूद

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

समस्या बनी रहती है देखते हैं कि, कुछ उपकरणों में।

मेरा अनुभव यह था कि जब मैंने डीबग मोड में कोशिश की तो उदाहरण मैंने काम किया, उसके बाद 3 और परीक्षण हुए, ऐसा हुआ कि मेरा एसडी अचानक दूषित हो गया, लेकिन मुझे नहीं लगता कि इसे अपने उदाहरण (मजाकिया) । मैंने एक नया एसडी कार्ड खरीदा और फिर से कोशिश की, केवल यह महसूस करने के लिए कि अभी भी रिलीज और डिबग मोड दोनों ही त्रुटि लॉग करते हैं: निर्देशिका ईनोन्ट मौजूद नहीं है। आखिरकार, मुझे निर्देशिकाएं बनाना पड़ता था, जिसमें मेरे फोन के कैमरे से कब्जे वाले चित्र होंगे। और मैं सही था, यह सिर्फ सही काम करता है।

मुझे आशा है कि इससे आपको और दूसरों को जवाब खोजने में मदद मिलेगी।

0

मैंने यूआरआई के साथ सामग्री का उपयोग किया और यह मेरे लिए काम किया। इसे एक और एसओ पोस्ट में देखा जो मुझे नहीं मिला।

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; 
     } 
संबंधित मुद्दे