1. 程式人生 > >android 路徑地址與Uri的相互轉換 uri轉string

android 路徑地址與Uri的相互轉換 uri轉string


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