Search code examples
androidandroid-imageviewandroid-bitmapbitmapfactory

BitmapFactory.decodeFile(mCurrentPhotoPath, bmOptions) returns FileNotFoundException


I am trying to display picture captured through camera intent (triggering inbuilt camera app) which is stored in external SD-card.

The file path and file name is stored in String variable 'mCurrentPhotoPath'.

I have verified that the image captured is stored in the location specified by 'mCurrentPhotoPath' using ES File Explorer app, but the BitmapFactory.decodeFile(mCurrentPhotoPath, bmOptions) is always returning FileNotFoundException. Here is my code to store the captured image:

    private void addPicToGallery() {

    File f = new File(mCurrentPhotoPath);
    //for debug purpose only
    Log.i(MYTAG, "value of mCurrentPhotoPath in addPicToGallery: " +mCurrentPhotoPath);
    Log.i(MYTAG, "value of f in addPicToGallery:  " +f);

    Uri contentUri = Uri.fromFile(f);

    //for debug only
    Log.i(MYTAG, "value of contentUri in addPicToGallery: " +contentUri);

    Intent mediaScanIntent = new    Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
    mediaScanIntent.setData(contentUri);
    sendBroadcast(mediaScanIntent);

}

Code for decoding a scaled image for display in ImageView:

    private void setFullImageFromFilePath() {

    Log.i(MYTAG, "Entered setFullImageFromFilePath method");

    // Get the dimensions of the View
    int targetW = mImageView.getWidth();
    int targetH = mImageView.getHeight();

    Log.i(MYTAG,"var targetW in setFullImageFromFilePath is:"  +targetW);
    Log.i(MYTAG,"the targetH in setFullImageFromFilePath is:" + targetH);


    // Get the dimensions of the bitmap
    BitmapFactory.Options bmOptions = new BitmapFactory.Options();
    bmOptions.inJustDecodeBounds = true;

    Log.i(MYTAG, "the mCurrentPhotoPath in setFullImageFromFilePath is:" + mCurrentPhotoPath);


   BitmapFactory.decodeFile(mCurrentPhotoPath, bmOptions);
    int photoW= bmOptions.outWidth;
    int photoH = bmOptions.outHeight;

    //Determine how much to scale down the image
    int scaleFactor = Math.min(photoW/targetW, photoH/targetH);

    //Decode the image file into a Bitmap sized to fill the view
    bmOptions.inJustDecodeBounds = false;
    bmOptions.inSampleSize = scaleFactor;
    bmOptions.inPurgeable = true;

    Bitmap bitmap = BitmapFactory.decodeFile(mCurrentPhotoPath, bmOptions);
    mImageView.setImageBitmap(bitmap) ;

    }

However, BitmapFactory.decodeFile is not able to find the file at the location stored in mCurrentPhotoPath resulting in FileNotFoundException.

Following is the LogCat output:

>07-20 21:28:11.897  32301-32301/org.assignment.lab.Pic I/Lab-Intents﹕ the mCurrentPhotoPath in setFullImageFromFilePath is:file:/storage/sdcard0/Pictures/JPEG_20150720_212749_-232171051.jpg
07-20 21:28:11.907  32301-32301/org.assignment.lab.Pic E/BitmapFactory﹕ Unable to decode stream: java.io.FileNotFoundException: /file:/storage/sdcard0/Pictures/JPEG_20150720_212749_-232171051.jpg: open failed: ENOENT (No such file or directory)
07-20 21:28:11.937  32301-32301/org.assignment.lab.Pic D/AndroidRuntime﹕ Shutting down VM
07-20 21:28:11.937  32301-32301/org.assignment.lab.Pic W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0x418d0ce0)
07-20 21:28:12.047  32301-32301/org.assignment.lab.Pic E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: org.assignment.lab.Pic, PID: 32301
java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1, result=-1, data=null} to activity {org.assignment.lab.mydailyselfie/org.coursera.assignment.lab.Pic.MainActivity}: java.lang.ArithmeticException: divide by zero

I am debugging this application in Android Kitkat 4.4.4 phone.

Please suggest what modification needed in BitmapFactory.decodeFile method so that it can get the file stored and display it in ImageView.

Thanks in advance.


Solution

  • Your mCurrentPhotoPath has a prefix "file:".

    Because of which the system is trying to refer to /file:/storage/sdcard0/etc... which points to no mounted disk.

    Remove that and try again with

    mCurrentPhotoPath = "/storage/sdcard0/Pictures/JPEG_20150720_212749_-232171051.jpg";
    

    Or, if your mCurrentPhotoPath will always have the prefix, do this before using it

    mCurrentPhotoPath = mCurrentPhotoPath.replace("file:", "");
    

    Hope this helps! :)