2013-07-09 13 views
9

Sto sviluppando un VideoPlayer. Converto il URI di un intent lanciato su una stringa e mi dà content://media/external...... Ma ho bisogno di ottenere il vero percorso.Ottieni percorso reale per Android Uri

Ad esempio:/storage/extSdcard.....

Come posso fare?

Ecco il mio codice, se necessario:

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

videoName = videoURI.toString(); 

tvTitle.setText(videoName); 

risposta

2

provate questo:

@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

è possibile utilizzare questo codice per il percorso vedio selezionato.

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

è possibile fare riferimento al link sottostante per il vostro aiuto.

Get filename and path from URI from mediastore

Spero che il successo.

5

Ecco qualcosa che ho usato prima:

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

ho trovato soluzione più eleganza:

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

Chiamatela come

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

imageFile = new File(getRealPathFromURI(selectedImageURI)); 

e il codice per 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

La maggior parte delle risposte non funziona sia per la galleria che per le immagini della telecamera. questo funziona per me. code.This

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

Usa questo codice .Questo sta lavorando per tutti i version.This Android è testato il supporto di tutti i dispositivi

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

come funziona su tutte le versioni di Android quando 'DocumentsContract' stesso è disponibile solo dal livello API 19 KitKat? https://developer.android.com/reference/android/provider/DocumentsContract.html –

+0

Utilizzare questo codice, quindi si verrà a sapere che funziona in tutti i dispositivi e ci sono condizioni in base ai livelli API. –

+1

dovrebbe aver menzionato la risposta originale: http://stackoverflow.com/a/27271131/1567541 –

0

qui ottengo uri dall'alto onActivityResult()

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

1) In frammento è possibile utilizzare la funzione in questo modo ..

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) E l'attività è possibile utilizzare una funzione del genere.

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; 
    } 
Problemi correlati