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

Are Regular VACUUM ANALYZE Still Recommended Under 9.1?

Can Feynman Diagrams Be Used To Represent Any Perturbation Theory?