android图片文件的路径地址与Uri的相互转换

泡在网上的日子 / 文 发表于2014-08-21 14:56 次阅读 media

一个android文件的Uri地址一般如下:

content://media/external/images/media/62026

这是一张图片的Uri,那么我们如何根据这个Uri获得其在文件系统中的路径呢?

其实很简单,直接上代码:

/**
 * Try to return the absolute file path from the given Uri
 *
 * @param context
 * @param uri
 * @return the file path or null
 */
public static String getRealFilePath( final Context context, final Uri uri ) {
    if ( null == uri ) return null;
    final String scheme = uri.getScheme();
    String data = null;
    if ( scheme == null )
        data = uri.getPath();
    else if ( ContentResolver.SCHEME_FILE.equals( scheme ) ) {
        data = uri.getPath();
    } else if ( ContentResolver.SCHEME_CONTENT.equals( scheme ) ) {
        Cursor cursor = context.getContentResolver().query( uri, new String[] { ImageColumns.DATA }, null, null, null );
        if ( null != cursor ) {
            if ( cursor.moveToFirst() ) {
                int index = cursor.getColumnIndex( ImageColumns.DATA );
                if ( index > -1 ) {
                    data = cursor.getString( index );
                }
            }
            cursor.close();
        }
    }
    return data;
}

那么假如我们有一个图片的路径地址又该如何获得其Uri呢?

   
                String type = Utils.ensureNotNull(intent.getType());
                Log.d(TAG, "uri is " + uri);
                if (uri.getScheme().equals("file") && (type.contains("image/"))) {
                    String path = uri.getEncodedPath();
                    Log.d(TAG, "path1 is " + path);
                    if (path != null) {
                        path = Uri.decode(path);
                        Log.d(TAG, "path2 is " + path);
                        ContentResolver cr = this.getContentResolver();
                        StringBuffer buff = new StringBuffer();
                        buff.append("(")
                                .append(Images.ImageColumns.DATA)
                                .append("=")
                                .append("'" + path + "'")
                                .append(")");
                        Cursor cur = cr.query(
                                Images.Media.EXTERNAL_CONTENT_URI,
                                new String[] { Images.ImageColumns._ID },
                                buff.toString(), null, null);
                        int index = 0;
                        for (cur.moveToFirst(); !cur.isAfterLast(); cur
                                .moveToNext()) {
                            index = cur.getColumnIndex(Images.ImageColumns._ID);
                            // set _id value
                            index = cur.getInt(index);
                        }
                        if (index == 0) {
                            //do nothing
                        } else {
                            Uri uri_temp = Uri
                                    .parse("content://media/external/images/media/"
                                            + index);
                            Log.d(TAG, "uri_temp is " + uri_temp);
                            if (uri_temp != null) {
                                uri = uri_temp;
                            }
                        }
                    }
                }
                   


收藏 赞 (35) 踩 (132)
上一篇:android imageview scaletype属性
android imageview scaletype属性并不是很常用,以至于到现在我才注意到,但是在某些应用中,这是一个很重要的属性,比如相册应用。 ImageView的Scaletype决定了图片在View上显示时的样子,如进行何种比例的缩放,及显示图片的整体还是部分,等等。 设置的方
下一篇:aFileChooser:兼容android2.1+的文件选择器
aFileChooser是一个简化文件浏览与选择过程的android项目。他主要是面向开发者,让任何人都能轻易实现自己的文件浏览器或者文件选择对话框。 intents使得第三方app在选择系统内容资源成为可能,但是如果你想要用户能根据自己的想法选择任意一个文件,你必须