android选择图片,通过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());
    }
  • android 4.4以上跟android4.4以前的版本通过uri获取路径方法不一样,所以代码做了处理
  • android5.1.1 一个图片的uri→content://com.android.providers.media.documents/document/image:68

原文地址:https://www.cnblogs.com/endian11/p/9089890.html

时间: 2024-08-08 18:31:51

android选择图片,通过uri获取路径的相关文章

GetPathFromUri4kitkat【Android 4.4 kitkat以上及以下根据uri获取路径的方法】

版权声明:本文为博主原创文章,未经博主允许不得转载. 前言 在Android4.4之前和之后,通过Intent调用文件管理器选择文件,获取的文件uri地址形式是不同的. Android6.0 content://com.android.providers.media.documents/document/image%3A593410 Android4.2.2 file:///storage/emulated/0/Pictures/Screenshots/Screenshot_2017-04-17

Android 4.4 kitkat以上及以下根据uri获取路径的方法

转载请注明出处,谢谢~ 今天我在做视频编辑的时候,遇到了这个问题,前后用了1个小时来发现并解决了这个问题,因为我一直认为是我记错了,后来发现,华为P6用的是Android4.4系统,然后我就恍然了... 首先说说我在做什么,我在弄一个拍摄完视频之后,编辑视频的一个东东,这个东东其实不难,源码里有,你们是不是不敢信?!在android源码android.media.videoeditor中有videoeditor这个类,这个其实就是谷歌写的编辑视频的东东,他底层调用了几个C++写的lib库,这些库

android选择图片或拍照图片上传到服务器(包括上传参数)

From:http://blog.csdn.net/springsky_/article/details/8213898具体上传代码: 1.选择图片和上传界面,包括上传完成和异常的回调监听 [java] view plaincopy package com.spring.sky.image.upload; import java.util.HashMap; import java.util.Map; import android.app.Activity; import android.app.

android 选择图片 剪裁 拍照 兼容所有版本的代码

前言,版本兼容问题主要是由于4.4以前和4.4以后的Uri的格式不同所造成的错误 资料 Android 4.4从图库选择图片,获取图片路径并裁剪 1.拍照 和选择图片 ①选择图片 1 intent = new Intent(Intent.ACTION_GET_CONTENT); 2 intent.setType("image/*"); 3 startActivityForResult(intent, GALLERY_REQUEST_CODE);   ②拍照 1 intent = new

android 选择图片或拍照时旋转了90度问题

由于前面的博文中忽略了点内容,所以在这里补上,下面内容就是解决拍照或者选择图片显示的时候图片旋转了90度或者其他度数问题,以便照片可以正面显示:具体如下: 首先直接看上面博文下的拍完照或者选完图后处理部分: @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { switch (resultCode) { case 1: if (data != null) { // 取得返

android 选择图片拍照并剪切照片上传到服务器

界面调用方法: pickerPicture 和 pickerPictureOk 为父类方法, 父类方法中调用上传,界面中只需要处理这两个方法即可; 父类中处理打开照片,选择完成 和上传到服务器 调用 上传完成通知界面 选择图片并剪切,4.4的手机不同于其他 package com.idonoo.shareCar.ui.commom.activitys; import java.io.File; import android.app.Activity; import android.content

Android 选择图片

利用intent进入到选择图片的Android内置activity中 Intent intent = new Intent(); /* 开启Pictures画面Type设定为image */ intent.setType("image/*"); /* 使用Intent.ACTION_GET_CONTENT这个Action */ intent.setAction(Intent.ACTION_GET_CONTENT); /* 取得相片后返回本画面 */ startActivityForRe

Android Studio 第七十期 - Android下载图片安装apk 获取权限

代码已经整理好,效果如下图: 地址:https://github.com/geeklx/myapplication2018/tree/master/p013_updatemanagerpermission 原文地址:http://blog.51cto.com/liangxiao/2150519

Android 拍照或者从相册获取图片的实现

我们常常会用到上传头像,或者发帖子的时候选择本地图片上传的功能.这个很常见 今天因为app的需求我研究了下.现在分享下. 其实不论是通过拍照还是从相册选取都会用到Intent 这是系统提供给我们用来调用系统方法的好用工具! 首先,需要设计下我们想怎么调用系统的拍照或者选取图片的方法 我们可以点击头像或者一个按钮然后弹出一个对话框,让用户自己 选择是拍照还是选择图片(如下图) . 那这个对话框怎么写呢.通过AlertDialog来实现(我们就给这个方法起名叫dialog): //对头像操作 pri