如何从Uri获得Real Path?

时间:2014-04-29 09:37:51

标签: android uri realpath

我想将文件上传到服务器。所以我使用文件选择器。但我有一些应用程序的问题,从uri获得真正的路径。如果内容是v的情况 意识形态,音频或图像或如果我可以直接获得路径我没有问题。实施的方法是:

public String getRealAudioPathFromURI(Uri contentUri) {
        String[] proj = { MediaStore.Audio.Media.DATA };

        //This method was deprecated in API level 11
        //Cursor cursor = managedQuery(contentUri, proj, null, null, null);

        CursorLoader cursorLoader = new CursorLoader(
                this,
                contentUri, proj, null, null, null);
        Cursor cursor = cursorLoader.loadInBackground();

        int column_index =
                cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA);
        cursor.moveToFirst();
        return cursor.getString(column_index);
    }

它是图像和视频的一部分。但我的问题是当内容在这个形式时:

content://com.dataviz.dxtg.documentprovider/document/file%3A%2F%2F%2Fmnt%2Fsdcard%2FDownload%2Arbres.png

我尝试了方法

private String getFilePathFromContentUri(Uri selectedVideoUri,
                                             ContentResolver contentResolver) {
        String filePath;
        String[] filePathColumn = {MediaStore.MediaColumns.DATA};

        Cursor cursor = contentResolver.query(selectedVideoUri, filePathColumn, null, null, null);
        cursor.moveToFirst();

        int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
        filePath = cursor.getString(columnIndex);
        cursor.close();
        return filePath;
    }

那么如何从URi获取真实路径以及是否存在其他内容类型。

获取我的真实路径如下:

//Uri return from external activity
            orgUri = data.getData();
            text1.setText("fichier à envoyer " + orgUri.toString() + "\n");
            // imagepath = orgUri.toString() ;
            //path converted from Uri
            //convertedPath = orgUri.getPath();
            if(orgUri.toString().contains(IMAGEMEDIA)){
                convertedPath = getRealPathFromURI(orgUri);
            } else if(orgUri.toString().contains(AUDIOMEDIA)){
                  convertedPath = getRealAudioPathFromURI(orgUri);

            }
            else if(orgUri.toString().contains(VIDEOMEDIA)){
                convertedPath = getRealvideoPathFromURI(orgUri);

            }else {

                if(orgUri.toString().contains("content")){
                    convertedPath = getFilePathFromContentUri(orgUri,
                            getApplicationContext().getContentResolver());

                }   else {

                convertedPath = orgUri.getPath();
                }
            }

3 个答案:

答案 0 :(得分:2)

尝试这个

Uri selectedFile = data.getData();
String path = selectedFile.getPath();

它对我有用。 如果它不是让我通知我还有另一种方式

答案 1 :(得分:2)

这对我有用......

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

答案 2 :(得分:0)

这是解码的问题。所以解决方案是为方法添加解码。如下所示:

private String getFilePathFromContentUri(Uri selectedVideoUri,
                                             ContentResolver contentResolver) throws UnsupportedEncodingException {
        String filePath;
        String[] filePathColumn = {MediaStore.MediaColumns.DATA};

        Cursor cursor = contentResolver.query(selectedVideoUri, filePathColumn, null, null, null);
        cursor.moveToFirst();

        int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
        filePath = cursor.getString(columnIndex);
        cursor.close();
        String result = java.net.URLDecoder.decode(filePath, "UTF-8");
        return result;
    }

我的onActivityResult:

 @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if(resultCode == RESULT_OK){

            //image.setImageBitmap(null);

            //Uri return from external activity
            orgUri = data.getData();
            text1.setText("fichier à envoyer " + orgUri.toString() + "\n");
            // imagepath = orgUri.toString() ;
            //path converted from Uri
            //convertedPath = orgUri.getPath();
            if(orgUri.toString().contains(IMAGEMEDIA)){
                convertedPath = getRealPathFromURI(orgUri);
            } else if(orgUri.toString().contains(AUDIOMEDIA)){
                  convertedPath = getRealAudioPathFromURI(orgUri);

            }
            else if(orgUri.toString().contains(VIDEOMEDIA)){
                convertedPath = getRealvideoPathFromURI(orgUri);

            }else {

                if(orgUri.toString().contains("content")){
                    try {
                        convertedPath = getFilePathFromContentUri(orgUri,
                                getApplicationContext().getContentResolver());
                    } catch (UnsupportedEncodingException e) {
                        e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
                    }

                }   else {

                convertedPath = orgUri.getPath();
                }
            }

           // text2.setText("Real Path: " + convertedPath + "\n");
            imagepath =  convertedPath;
 uriFromPath = Uri.fromFile(new File(convertedPath));

}
}