BitmapFactory.decodeFile returns fileNotFoundException

11,426

Solution 1

Try this....image uri

Uri imageUri = data.getData();
try {
   bm = MediaStore.Images.Media.getBitmap(this.getContentResolver(), imageUri);
   iv_profile.setImageBitmap(bm);
} catch (FileNotFoundException e) {
  // TODO Auto-generated catch block
   e.printStackTrace();
} catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
}

Solution 2

Thanks for the responses, it put me in the right direction. Eventually this post helped me further: https://stackoverflow.com/a/2636538/3287175

Share:
11,426
vaultboy
Author by

vaultboy

Updated on June 25, 2022

Comments

  • vaultboy
    vaultboy about 2 years

    I have a problem concerning the BitMapFactory.decodeFile.

    In my app, I want to user to be able to select an image from his/her device or take a photograph. This must then be displayed in an ImageView (medication_photo). I try to downscale the image as well because in my previous code I got OutOfMemory errors.

    The problem is that after selecting an image, my app throws this exception:

    FileNotFoundException: Unable to decode stream: 
    java.io.FileNotFoundException: /content:/media/external/images/media/1499:
    open failed: ENOENT (No such file or directory)
    

    Code snippet:

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    
        if (requestCode == CAPTURE_PHOTO) {
            if (resultCode == RESULT_OK) {
                String result = data.getDataString();
                setPhoto(result);
            }
        }
    
        // browse photo
        if (requestCode == BROWSE_PHOTO) {
            if (resultCode == RESULT_OK) {
                String result = data.getDataString();
                setPhoto(result);
            }
            if (resultCode == RESULT_CANCELED) {
    
            }
        }
    }
    
    
    
    private void setPhoto(String path) {
        // re-scale image first
        try {
            File file = new File(path);
            Log.e("MedicationAdd.setPhoto->file",file.getAbsolutePath()); // this did not work 
    
            BitmapFactory.Options options = new BitmapFactory.Options();
            options.inJustDecodeBounds = true; 
            BitmapFactory.decodeFile(path,options); // FileNotFound
            options.inSampleSize = scaleDownBitmap(options, options.outWidth, options.outHeight);
            Log.e("MedicationAdd.setPhoto->path",path);
            options.inJustDecodeBounds = false;
            this.bm = BitmapFactory.decodeFile(path,options); // FileNotFound
    
            this.medication_photo.setImageBitmap(this.bm);
        } catch (Exception e) {
            Log.e("MedicationAdd.setPhoto", e.toString());
        }
    }
    
  • vaultboy
    vaultboy over 10 years
    This will probably work, but it causes OutOfMemory errors. I tried to downscale the image before it allocates memory.
  • Dev 9
    Dev 9 over 10 years
    here is to use lazyloding. use below link..stackoverflow.com/questions/21598984/…
  • vaultboy
    vaultboy over 10 years
    The 'File file = new File(path);' I forgot to remove, I do not use it. The path is passed to setPhoto from onActivityResult.
  • vaultboy
    vaultboy over 10 years
    I still don't understand, it works when I use MediaStore.Images.Media.getBitmap(this.getContentResolver(), imageUri); So how can I find the right path?