Android: decodeFile always returns null for file in internal storage

47,946

Solution 1

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();

Solution 2

Instead of using BitmapFactory.decodeFile, try using InputStream:

@Override
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);

Solution 3

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.

Solution 4

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

Solution 5

After adding the required permissions (READ_EXTERNAL_STORAGE, WRITE_EXTERNAL_STORAGE)

You need to add this line to manifests: android:requestLegacyExternalStorage="true"

enter image description here

Share:
47,946
Jahmic
Author by

Jahmic

Experienced software developer working in the Tokyo area.

Updated on July 09, 2022

Comments

  • Jahmic
    Jahmic almost 2 years

    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);
    
  • Jahmic
    Jahmic about 13 years
    Actually, I used that to verify the file does in the Logcat output. So, the file is there.
  • Jahmic
    Jahmic about 13 years
    Good info to know, but in this case, the file is downloaded into the app's private storage and not in the resources.
  • Jesse Black
    Jesse Black over 12 years
    you SHOULD answer your own question. I landed on this question with the same problem and got the solution from you. The question you reference as having the answer wasn't in my initial search either. Cheers!