Android根据图片Uri获取图片绝对路径

来源:互联网 发布:c语言单链表的创建 编辑:程序博客网 时间:2024/05/16 14:30

转自: http://www.jianshu.com/p/b168cbe50066

选择文件时,通常会使用如下方法,以图片为例:

// 进入选择图片的界面private void selectImage(){        Intent intent = new Intent(Intent.ACTION_GET_CONTENT);        intent.setType("image/*");        startActivityForResult(intent, YOUR_CHOOSE_IMAGE_REQUEST_CODE);}// 在onActivityResult()回调方法中进行数据获取protected void onActivityResult(int requestCode, int resultCode, Intent data) {        // ... 进行一些判断处理        Uri uri = data.getData();        // ... 接下来进行图片显示}

在不同的版本中,返回的uri类型是不一样的,需要针对不同类型的uri做处理,来获取文件的真实路径.

/**     * 根据Uri获取图片的绝对路径     *     * @param context 上下文对象     * @param uri     图片的Uri     * @return 如果Uri对应的图片存在, 那么返回该图片的绝对路径, 否则返回null     */    public static String getRealPathFromUri(Context context, Uri uri) {        int sdkVersion = Build.VERSION.SDK_INT;        if (sdkVersion >= 19) { // api >= 19            return getRealPathFromUriAboveApi19(context, uri);        } else { // api < 19            return getRealPathFromUriBelowAPI19(context, uri);        }    }    /**     * 适配api19以下(不包括api19),根据uri获取图片的绝对路径     *     * @param context 上下文对象     * @param uri     图片的Uri     * @return 如果Uri对应的图片存在, 那么返回该图片的绝对路径, 否则返回null     */    private static String getRealPathFromUriBelowAPI19(Context context, Uri uri) {        return getDataColumn(context, uri, null, null);    }    /**     * 适配api19及以上,根据uri获取图片的绝对路径     *     * @param context 上下文对象     * @param uri     图片的Uri     * @return 如果Uri对应的图片存在, 那么返回该图片的绝对路径, 否则返回null     */    @SuppressLint("NewApi")    private static String getRealPathFromUriAboveApi19(Context context, Uri uri) {        String filePath = null;        if (DocumentsContract.isDocumentUri(context, uri)) {            // 如果是document类型的 uri, 则通过document id来进行处理            String documentId = DocumentsContract.getDocumentId(uri);            if (isMediaDocument(uri)) { // MediaProvider                // 使用':'分割                String id = documentId.split(":")[1];                String selection = MediaStore.Images.Media._ID + "=?";                String[] selectionArgs = {id};                filePath = getDataColumn(context, MediaStore.Images.Media.EXTERNAL_CONTENT_URI, selection, selectionArgs);            } else if (isDownloadsDocument(uri)) { // DownloadsProvider                Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.valueOf(documentId));                filePath = getDataColumn(context, contentUri, null, null);            }        } else if ("content".equalsIgnoreCase(uri.getScheme())){            // 如果是 content 类型的 Uri            filePath = getDataColumn(context, uri, null, null);        } else if ("file".equals(uri.getScheme())) {            // 如果是 file 类型的 Uri,直接获取图片对应的路径            filePath = uri.getPath();        }        return filePath;    }    /**     * 获取数据库表中的 _data 列,即返回Uri对应的文件路径     * @return     */    private static String getDataColumn(Context context, Uri uri, String selection, String[] selectionArgs) {        String path = null;        String[] projection = new String[]{MediaStore.Images.Media.DATA};        Cursor cursor = null;        try {            cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null);            if (cursor != null && cursor.moveToFirst()) {                int columnIndex = cursor.getColumnIndexOrThrow(projection[0]);                path = cursor.getString(columnIndex);            }        } catch (Exception e) {            if (cursor != null) {                cursor.close();            }        }        return path;    }    /**     * @param uri the Uri to check     * @return Whether the Uri authority is MediaProvider     */    private static boolean isMediaDocument(Uri uri) {        return "com.android.providers.media.documents".equals(uri.getAuthority());    }    /**     * @param uri the Uri to check     * @return Whether the Uri authority is DownloadsProvider     */    private static boolean isDownloadsDocument(Uri uri) {    return  "com.android.providers.downloads.documents".equals(uri.getAuthority());    }
阅读全文
0 0
原创粉丝点击