Create File from Uri type android

14,165
 Uri currImageURI = data.getData();

printing currImageURI will give you some thing like this:

content://media/external/images/media/47

But what we need is the absolute path of that particular image . So we need to get real path from uri

public String getRealPathFromURI(Context context, Uri contentUri) {
  Cursor cursor = null;
  try { 
    String[] proj = { MediaStore.Images.Media.DATA };
    cursor = context.getContentResolver().query(contentUri,  proj, null, null, null);
    int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
    cursor.moveToFirst();
    return cursor.getString(column_index);
  } finally {
    if (cursor != null) {
      cursor.close();
    }
  }
}

Now modifiy your code like

public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode == Activity.RESULT_OK) {
            if (requestCode == 1) {
                // currImageURI is the global variable I’m using to hold the content:
                currImageURI = data.getData();
                //Save the currImageUri (URI type) to global variable.
                photosHolder.getInstance().setOneIm(getRealPathFromURI(getActivity(),currImageURI));
            }
        }
    }

public String getRealPathFromURI(Context context, Uri contentUri) {
  Cursor cursor = null;
  try { 
    String[] proj = { MediaStore.Images.Media.DATA };
    cursor = context.getContentResolver().query(contentUri,  proj, null, null, null);
    int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
    cursor.moveToFirst();
    return cursor.getString(column_index);
  } finally {
    if (cursor != null) {
      cursor.close();
    }
  }
}
Share:
14,165

Related videos on Youtube

Chlebta
Author by

Chlebta

A software eengineer who love coding.

Updated on June 04, 2022

Comments

  • Chlebta
    Chlebta almost 2 years

    I'm trying to select image from gallery then convert this image to File and send it via HttpPost but I'm getting always FileNotFoundException. This my Code :

    Selecting the photo

    public void onActivityResult(int requestCode, int resultCode, Intent data) {
            if (resultCode == Activity.RESULT_OK) {
                if (requestCode == 1) {
                    // currImageURI is the global variable I’m using to hold the content:
                    currImageURI = data.getData();
                    //Save the currImageUri (URI type) to global variable.
                    photosHolder.getInstance().setOneIm(currImageURI);
                }
            }
        }
    

    Converting the photo

                    // First Try
                    File myFile = new File((photosHolder.getInstance().getOneIm()).toString());
                    params.put("visit_report[photos_attributes][0][file]",myFile); **The exception Raised here
    // second try 
                    File myFile2 = new File((photosHolder.getInstance().getOneIm()).getPath());
                    params.put("visit_report[photos_attributes][1][file]",myFile2); ** Also here
    

    And those are myFiles Value while debuging :

    mFile : content:/com.android.providers.media.documents/document/image%3A19143
    myFile2 : /document/image:19143
    

    So any help ?


    Update I have tried this solution also :

    //get The real path from uri then save it (and then use it to create the file)
    photosHolder.getInstance().setUriString(getRealPathFromURI(currImageURI));
    
    //Convert the image URI to the direct file system path of the image file
        private String getRealPathFromURI(Uri contentURI) {
            String result = "";
            try {
            Cursor cursor = getActivity().getContentResolver().query(contentURI, null, null, null, null);
            if (cursor == null) { // Source is Dropbox or other similar local file path
                result = contentURI.getPath();
            } else {
                cursor.moveToFirst();
                int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA); 
                result = cursor.getString(idx); // Exception raised HERE
                cursor.close(); }
            } catch (Exception e) {
                e.printStackTrace();
            }
            return result;
        }
    

    But I got java.lang.IllegalStateException: Couldn't read row 0, col -1 from CursorWindow. Make sure the Cursor is initialized correctly before accessing data from it and the idx var == to -1

    Also I have tried @Praneeth Kalluri Solution but it returns always null as result.

  • Chlebta
    Chlebta over 9 years
    The function you gave is always returning null .