2013-07-09 60 views
9

我開發一個VideoPlayer。我轉換推出意圖字符串的URI,這讓我content://media/external.....。但我需要得到真正的道路。獲取真實路徑對於開放的安卓

例如:/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

您可以使用所選錄象路徑此代碼。

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

使用此代碼。這是工作所有Android version.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

當'DocumentsContract'本身僅在API級別19 KitKat後纔可用時,這是如何工作在所有Android版本上的? 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; 
    }