2013-07-09 3 views
9

Я разрабатываю VideoPlayer. Я конвертирую URI с запущенным намерением в строку, и это дает мне content://media/external...... Но мне нужно получить реальный путь.Получить реальный путь для Uri Android

Например:/storage/extSdcard.....

Как это сделать?

Вот мой код, если это необходимо:

videoURI = getIntent().getData(); 
vv.setVideoURI(videoURI); 

videoName = videoURI.toString(); 

tvTitle.setText(videoName); 

ответ

2

Попробуйте:

@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 

      } 
     } 
11

вы можете использовать этот код для выбранного пути Vedio.

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

Вы можете переслать приведенную ниже ссылку для получения вашей помощи.

Get filename and path from URI from mediastore

Я надеюсь, что вы успеха.

5

Вот то, что я использовал раньше:

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; 
} 
3

Я нашел больше элегантности решение:

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 
2

Называйте это как

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

imageFile = new File(getRealPathFromURI(selectedImageURI)); 

и код для 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; 
} 
3

Большинство ответов не работает как для галереи, так и для изображений с камеры. это работает для меня.

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; 
} 
11

Используйте этот код .Эта работает для всех андроид version.This тестируется code.This поддерживает все устройства

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()); 
} 
+0

Как это работает во всех версиях Android, когда 'DocumentsContract' сам доступен только с API-уровня 19 KitKat? https://developer.android.com/reference/android/provider/DocumentsContract.html –

+0

Используйте этот код, после чего вы узнаете, что он работает на всех устройствах, и есть условия в соответствии с уровнями api. –

+1

должен был упомянуть исходный ответ: http://stackoverflow.com/a/27271131/1567541 –

0

здесь я получаю от URI на onActivityResult()

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

1) В фрагменте вы можете использовать такую ​​функцию.

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) И вы можете использовать такую ​​функцию.

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; 
    } 
Смежные вопросы