从mediastore的uri中获得文件名和路径

我有一个从mediastore图像选择返回的onActivityResult,我可以用下边的代码给一个图像获得一个URI:

 Uri selectedImage = data.getData();

把它转换成一个字符串给这个:

content://media/external/images/media/47

或者转换成一个路径给这个::

/external/images/media/47

然后我好像不能找到一个方法把它转换成一个绝对路径,因为我想要把一个图片加载成位图而不用四处复制。我知道这个可以用URI和内容解析器来做,但是这似乎要打破了要一直重启手机,我猜MediaStore不能保持它的在不断重启之间相同的编号。

public String getRealPathFromURI(Uri contentUri) {
        String[] proj = { MediaStore.Images.Media.DATA };
        Cursor cursor = managedQuery(contentUri, proj, null, null, null);
        int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
        return cursor.getString(column_index);
    }

不要试图在文件系统中找一个uri,这个在数据库中找东西会很慢。

你可以通过提供一个输入流到factory从一个uri得到一个位图,就像你将给文件给factory一样:

InputStream is = getContentResolver().openInputStream(uri);
Bitmap bitmap = BitmapFactory.decodeStream(is);
is.close();

mActivity.managedQuery()现在已经不赞成用了。下边是代码

private String getRealPathFromURI(Uri contentUri) {
    String[] proj = { MediaStore.Images.Media.DATA };
    CursorLoader loader = new CursorLoader(mContext, contentUri, proj, null, null, null);
    Cursor cursor = loader.loadInBackground();
    int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
    cursor.moveToFirst();
    return cursor.getString(column_index);
}