Get Real Path For Uri Android

匿名 (未验证) 提交于 2019-12-03 02:13:02

问题:

I am developing a VideoPlayer. I convert the URI of a launched intent to a string and it gives me content://media/external...... But I need to get the real path.

For example: /storage/extSdcard.....

How do I do this?

Here is my code if needed:

videoURI = getIntent().getData(); vv.setVideoURI(videoURI);  videoName = videoURI.toString();  tvTitle.setText(videoName); 

回答1:

you can use this code for selected vedio path.

Uri uri = data.getData(); String[] filePathColumn = {MediaStore.Images.Media.DATA}; Cursor cursor = getContentResolver().query(uri, filePathColumn, null, null, null);  if(cursor.moveToFirst()){    int columnIndex = cursor.getColumnIndex(filePathColumn[0]);    String yourRealPath = cursor.getString(columnIndex); } else {    //boooo, cursor doesn't have rows ... } cursor.close(); 

you can refer the below link for your help.

Get filename and path from URI from mediastore

I hope you will success.



回答2:

Use this code .This is working for all android version.This is tested code.This support all devices

public static String getPathFromUri(final Context context, final Uri uri) {          final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;          // DocumentProvider         if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {             // ExternalStorageProvider             if (isExternalStorageDocument(uri)) {                 final String docId = DocumentsContract.getDocumentId(uri);                 final String[] split = docId.split(":");                 final String type = split[0];                  if ("primary".equalsIgnoreCase(type)) {                     return Environment.getExternalStorageDirectory() + "/" + split[1];                 }                  // TODO handle non-primary volumes             }             // DownloadsProvider             else if (isDownloadsDocument(uri)) {                  final String id = DocumentsContract.getDocumentId(uri);                 final Uri contentUri = ContentUris.withAppendedId(                         Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));                  return getDataColumn(context, contentUri, null, null);             }             // MediaProvider             else if (isMediaDocument(uri)) {                 final String docId = DocumentsContract.getDocumentId(uri);                 final String[] split = docId.split(":");                 final String type = split[0];                  Uri contentUri = null;                 if ("image".equals(type)) {                     contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;                 } else if ("video".equals(type)) {                     contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;                 } else if ("audio".equals(type)) {                     contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;                 }                  final String selection = "_id=?";                 final String[] selectionArgs = new String[] {                         split[1]                 };                  return getDataColumn(context, contentUri, selection, selectionArgs);             }         }         // MediaStore (and general)         else if ("content".equalsIgnoreCase(uri.getScheme())) {              // Return the remote address             if (isGooglePhotosUri(uri))                 return uri.getLastPathSegment();              return getDataColumn(context, uri, null, null);         }         // File         else if ("file".equalsIgnoreCase(uri.getScheme())) {             return uri.getPath();         }          return null;     }      public static String getDataColumn(Context context, Uri uri, String selection,                                        String[] selectionArgs) {          Cursor cursor = null;         final String column = "_data";         final String[] projection = {                 column         };          try {             cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs,                     null);             if (cursor != null && cursor.moveToFirst()) {                 final int index = cursor.getColumnIndexOrThrow(column);                 return cursor.getString(index);             }         } finally {             if (cursor != null)                 cursor.close();         }         return null;     }       /**      * @param uri The Uri to check.      * @return Whether the Uri authority is ExternalStorageProvider.      */     public static boolean isExternalStorageDocument(Uri uri) {         return "com.android.externalstorage.documents".equals(uri.getAuthority());     }      /**      * @param uri The Uri to check.      * @return Whether the Uri authority is DownloadsProvider.      */     public static boolean isDownloadsDocument(Uri uri) {         return "com.android.providers.downloads.documents".equals(uri.getAuthority());     }      /**      * @param uri The Uri to check.      * @return Whether the Uri authority is MediaProvider.      */     public static boolean isMediaDocument(Uri uri) {         return "com.android.providers.media.documents".equals(uri.getAuthority());     }      /**      * @param uri The Uri to check.      * @return Whether the Uri authority is Google Photos.      */     public static boolean isGooglePhotosUri(Uri uri) {         return "com.google.android.apps.photos.content".equals(uri.getAuthority()); } 


回答3:

Here's something I have used before:

public String getRealPathFromURI (Uri contentUri) {     String path = null;     String[] proj = { MediaStore.MediaColumns.DATA };     Cursor cursor = getContentResolver().query(contentUri, proj, null, null, null);     if (cursor.moveToFirst()) {        int column_index = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.DATA);        path = cursor.getString(column_index);     }     cursor.close();     return path; } 


回答4:

Most of the answers doesnt work for both gallery and camera images. this works for me.

public static String getPath(final Context context, final Uri uri) {     final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;     Log.i("URI",uri+"");     String result = uri+"";     // DocumentProvider      //  if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {      if (isKitKat && (result.contains("media.documents"))) {         String[] ary = result.split("/");         int length = ary.length;         String imgary = ary[length-1];         final String[] dat = imgary.split("%3A");         final String docId = dat[1];         final String type = dat[0];         Uri contentUri = null;         if ("image".equals(type)) {             contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;         } else if ("video".equals(type)) {         } else if ("audio".equals(type)) {         }          final String selection = "_id=?";         final String[] selectionArgs = new String[] {             dat[1]         };          return getDataColumn(context, contentUri, selection, selectionArgs);     } else if ("content".equalsIgnoreCase(uri.getScheme())) {         return getDataColumn(context, uri, null, null);     }      // File      else if ("file".equalsIgnoreCase(uri.getScheme())) {         return uri.getPath();     }      return null;  }   public static String getDataColumn(Context context, Uri uri, String selection, String[] selectionArgs) {     Cursor cursor = null;     final String column = "_data";     final String[] projection = {         column     };      try {          cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null);          if (cursor != null && cursor.moveToFirst()) {             final int column_index = cursor.getColumnIndexOrThrow(column);             return cursor.getString(column_index);         }      } finally {          if (cursor != null)             cursor.close();     }      return null;  }  


回答5:

Try This:

    @Override     protected void onActivityResult(int requestCode, int resultCode, Intent data) {         super.onActivityResult(requestCode, resultCode, data);          if (requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK && null != data) {             Uri selectedImage = data.getData();             String[] filePathColumn = { MediaStore.Images.Media.DATA };              Cursor cursor = getContentResolver().query(selectedImage,filePathColumn, null, null, null);             cursor.moveToFirst();              int columnIndex = cursor.getColumnIndex(filePathColumn[0]);             String picturePath = cursor.getString(columnIndex);              cursor.close();             System.out.println("picturePath +"+ picturePath );  //path of sdcard              }         } 


回答6:

I found more elegance solution:

Uri file_uri = Uri.parse(videoURI); // parse to Uri if your videoURI is string String real_path = file_uri.getPath(); // will return real file path 


回答7:

Call it like

 Uri selectedImageURI = data.getData(); //where data is intent return by onActivityResult  imageFile = new File(getRealPathFromURI(selectedImageURI)); 

and code for gettingPath..

private String getRealPathFromURI(Uri contentURI)  {     String result = null;      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      {          if(cursor.moveToFirst())         {             int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);              result = cursor.getString(idx);         }         cursor.close();     }     return result; } 


回答8:

here i get uri from on onActivityResult()

Uri selectedImageURI = data.getData(); String realPath = getRealPathFromURI(selectedImageURI); 

1) In fragment you can use function like this way..

private String getRealPathFromURI(Uri contentURI) {         String filePath;         Cursor cursor = getActivity().getContentResolver().query(contentURI, null, null, null, null);         if (cursor == null) {              filePath = contentURI.getPath();         } else {             cursor.moveToFirst();             int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);             filePath = cursor.getString(idx);             cursor.close();         }         return filePath;     } 

2) And activity you can use function like that.

private String getRealPathFromURI(Uri contentURI) {         String filePath;         Cursor cursor = getContentResolver().query(contentURI, null, null, null, null);         if (cursor == null) {              filePath = contentURI.getPath();         } else {             cursor.moveToFirst();             int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);             filePath = cursor.getString(idx);             cursor.close();         }         return filePath;     } 


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!