Android Get Real Path By Uri.getPath()


Answer :

This is what I do:

Uri selectedImageURI = data.getData(); imageFile = new File(getRealPathFromURI(selectedImageURI)); 

and:

private String getRealPathFromURI(Uri contentURI) {     String result;     Cursor cursor = 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);         cursor.close();     }     return result; } 

NOTE: managedQuery() method is deprecated, so I am not using it.

Last edit: Improvement. We should close cursor!!


Is it really necessary for you to get a physical path?
For example, ImageView.setImageURI() and ContentResolver.openInputStream() allow you to access the contents of a file without knowing its real path.


@Rene Juuse - above in comments... Thanks for this link !

. the code to get the real path is a bit different from one SDK to another so below we have three methods that deals with different SDKs.

getRealPathFromURI_API19(): returns real path for API 19 (or above but not tested) getRealPathFromURI_API11to18(): returns real path for API 11 to API 18 getRealPathFromURI_below11(): returns real path for API below 11

public class RealPathUtil {  @SuppressLint("NewApi") public static String getRealPathFromURI_API19(Context context, Uri uri){     String filePath = "";     String wholeID = DocumentsContract.getDocumentId(uri);       // Split at colon, use second item in the array      String id = wholeID.split(":")[1];       String[] column = { MediaStore.Images.Media.DATA };            // where id is equal to                   String sel = MediaStore.Images.Media._ID + "=?";       Cursor cursor = context.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,                                 column, sel, new String[]{ id }, null);       int columnIndex = cursor.getColumnIndex(column[0]);       if (cursor.moveToFirst()) {          filePath = cursor.getString(columnIndex);      }         cursor.close();      return filePath; }   @SuppressLint("NewApi") public static String getRealPathFromURI_API11to18(Context context, Uri contentUri) {       String[] proj = { MediaStore.Images.Media.DATA };       String result = null;        CursorLoader cursorLoader = new CursorLoader(               context,          contentUri, proj, null, null, null);               Cursor cursor = cursorLoader.loadInBackground();        if(cursor != null){        int column_index =           cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);        cursor.moveToFirst();        result = cursor.getString(column_index);       }       return result;   }  public static String getRealPathFromURI_BelowAPI11(Context context, Uri contentUri){            String[] proj = { MediaStore.Images.Media.DATA };            Cursor 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); } 

font: http://hmkcode.com/android-display-selected-image-and-its-real-path/


UPDATE 2016 March

To fix all problems with path of images i try create a custom gallery as facebook and other apps. This is because you can use just local files ( real files, not virtual or temporary) , i solve all problems with this library.

https://github.com/nohana/Laevatein (this library is to take photo from camera or choose from galery , if you choose from gallery he have a drawer with albums and just show local files)


Comments

Popular posts from this blog

Converting A String To Int In Groovy

"Cannot Create Cache Directory /home//.composer/cache/repo/https---packagist.org/, Or Directory Is Not Writable. Proceeding Without Cache"

Android How Can I Convert A String To A Editable