簡體   English   中英

如何從 Uri 獲取真實路徑?

[英]how to get Real Path from Uri?

我想將文件上傳到服務器。 所以我使用文件選擇器。 但是我在某些應用程序中遇到了從 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();
                }
            }

試試這個

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

這個對我有用。 如果不是讓我通知我還有另一種方法

這對我有用...

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

這是解碼的問題。 所以解決方案是在方法中添加解碼。 如下所示:

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

}
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM