Android 从data.getData()类型的URI获取实际路径file:///storage/emulated/0/LenovoReaper/did

Android 从data.getData()类型的URI获取实际路径file:///storage/emulated/0/LenovoReaper/did,android,uri,Android,Uri,当我选择文件并尝试获取其实际路径时,我的应用程序将进入ANR。我的 public static String getRealPathFromUri(Context context, Uri contentUri) { Cursor cursor = null; try { String[] proj = {MediaStore.Images.Media.DATA}; cursor = context.getCont

当我选择文件并尝试获取其实际路径时,我的应用程序将进入ANR。我的

 public static String getRealPathFromUri(Context context, Uri contentUri) {
        Cursor cursor = null;
        try {
            String[] proj = {MediaStore.Images.Media.DATA};
            cursor = context.getContentResolver().query(contentUri, proj, null, null, null);
            int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
            cursor.moveToFirst();
            return cursor.getString(column_index);
        } finally {
            if (cursor != null) {
                cursor.close();
            }
        }
    }
但如果我选择任何像图像这样的媒体文件,同样的方法也可以

适用于
data.getData()=content://media/external/images/media/22555 实际路径

实际路径是
/storage/simulated/0/DCIM/20150406\u 210053.jpg

对于非媒体文件,转到
ANR

data.getData() file:///storage/emulated/0/LenovoReaper/did
不返回任何内容,应用程序转到
ANR
。有人能建议如何获取这样的
URI
的实际路径吗?或者我应该从
data.getData()中删除
文件://

有人能建议如何获得这种URI的真实路径吗

除了
Uri
本身之外,没有“真正的路径”

我应该从data.getData()中删除文件:/

那对你没有任何好处


。没有要求任何
Uri
必须指向您可以访问的文件。如果要访问由
Uri
表示的数据,请使用
ContentResolver
上的方法,例如
openInputStream()

打开库使用以下代码:

Intent intent = new Intent();
                        intent.setType("image/*");
                        intent.setAction("android.intent.action.PICK");
                        startActivityForResult(intent, PICK_IMAGE_REQUEST);
在onActivityResult中:

if (requestCode == PICK_IMAGE_REQUEST && resultCode == RESULT_OK
                && data != null && data.getData() != null) {  
   String absolutePath = "file://" + getPath(this,data.getData());  
            
        }
和getPath函数:

public static String getPath( Context context, Uri uri ) {
    String result = null;
    String[] proj = { MediaStore.Images.Media.DATA };
    Cursor cursor = context.getContentResolver( ).query( uri, proj, null, null, null );
    if(cursor != null){
        if ( cursor.moveToFirst( ) ) {
            int column_index = cursor.getColumnIndexOrThrow( proj[0] );
            result = cursor.getString( column_index );
        }
        cursor.close( );
    }
    if(result == null) {
        result = "Not found";
    }
    Log.d(TAG, "onActivityResult: file://"+result);
    return result;
}
它将为您提供图像的绝对路径,如“file:///storage/emulated/0/LenovoReaper/did“