bitmapfactory – Android: decodeFile always returns null for file in internal storage-ThrowExceptions

Exception or error:

I have a file saved locally into the application’s private storage. I have verified it exists, however whenever I call BitmapFactory.decodeFile it always returns null.

If I save the file as a resource and use ImageView.setImageResource, it always shows up fine.

What is the problem?

Here is the snippet:

filename = "test.png";

if (doesFileExist(filename))
    Bitmap bMap = BitmapFactory.decodeFile(filename);

I’ve also tried:

Bitmap bMap = BitmapFactory.decodeFile(getFilesDir().getPath()
                    + filename);
How to solve:

This question has been answered before such as here:
BitmapFactory.decodeFile returns null even image exists

This was exactly what I needed:

String fname=new File(getFilesDir(), "test.png").getAbsolutePath();


Folks, files stored in app resource should be referenced in special way. E.g. if file is located in assets and named as “myfile.png” it has to be referenced as:

String uriString="file:///android_asset/myfile.png";
Uri uri=Uri.parse(uriString);


Instead of using BitmapFactory.decodeFile, try using InputStream:

protected void onActivityResult(int requestCode, int resultCode, Intent imageReturnedIntent) { 
    super.onActivityResult(requestCode, resultCode, imageReturnedIntent); 

    if(resultCode == RESULT_OK){          
        Uri selectedImage = imageReturnedIntent.getData();
        InputStream imageStream = getContentResolver().openInputStream(selectedImage);
        Bitmap yourSelectedImage = BitmapFactory.decodeStream(imageStream);


BitmapFactory.decodeFile expects a file path without the scheme. I.e. without the file:// in the beginning.

If you’re handling a Uri, don’t just .toString() it, but instead call .getPath() on it, and pass that to the method.


Could you try fileList()? It

returns an array of strings naming the
private files associated with this
Context’s application package.


For me I was getting image from locally saved URL something like “file:///storage/emulated/0/….” (I have used Phonegap plugin to capture image. Plugin was giving me image path, which I need to use in native code)

Here is the code snippet which worked for me.

String captured_image_info = "file:///storage/emulated/0/Android/data/com.testapp/cache/1493809796526.jpg"
Uri uri=Uri.parse(captured_image_info);
largeLog("uri", "" + uri);

InputStream imageStream = getContentResolver().openInputStream(uri);

Bitmap bm = BitmapFactory.decodeStream(imageStream);

ByteArrayOutputStream baos = new ByteArrayOutputStream();

bm.compress(Bitmap.CompressFormat.JPEG, 100, baos); //bm is the bitmap object

byte[] decodedBytes = baos.toByteArray();

Bitmap img_captured_image = BitmapFactory.decodeByteArray(decodedBytes, 0, decodedBytes.length);


You need to setup run-time permissions for Manifest.permission.READ_EXTERNAL_STORAGE
If you don’t you’ll get a null without getting any error message or even an indication in the Log.
Note that you need to request the permissions both in the Manifest and at run time.

Leave a Reply

Your email address will not be published. Required fields are marked *