2

我想将文件上传到服务器。所以我使用文件选择器。但是我在某些应用程序中遇到了从 uri 获取真实路径的问题。如果内容是视频、音频或图像,或者我可以直接获取路径,我没有问题。实施的方法是:

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

3 回答 3

2

试试这个

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

这个对我有用。如果不是让我通知我还有另一种方法

于 2014-04-29T09:47:59.393 回答
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; 
} 
于 2016-01-21T06:33:43.860 回答
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;
    }

我的活动结果:

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

}
}
于 2014-04-29T10:43:29.203 回答