代码已上传到我的github上https://github.com/LuJN/ChoosePicTest

case CHOOSE_PHOTO:                // 判断手机系统版本号                if(Build.VERSION.SDK_INT >= 19) {                    // 4.4及以上系统使用这个方法处理图片                    handleImageOnKitKat(data);                } else {                    // 4.4以下系统使用这个方法处理图片                    handleImageBeforeKitKat(data);                }                break;
大家看一下这段从相册中选择照片的代码,发现这里需要判断系统版本号,根据系统版本号来使用不同的方法,下面我们来看一下这两个方法都做了什么

先来看一下4.4以下系统的方法handleImageBeforeKitKat(data)

private void handleImageBeforeKitKat(Intent data) {        Uri uri = data.getData();        String imagePath = getImagePath(uri, null);        displayImage(imagePath);    }
很简单,就是根据uri来获得图片的路径

下面来看一下4.4以上系统(包括4.4)的方法handleImageOnKitKat(data)

@TargetApi(Build.VERSION_CODES.KITKAT)    private void handleImageOnKitKat(Intent data) {        String imagePath = null;        Uri uri = data.getData();        if(DocumentsContract.isDocumentUri(this, uri)) {            // 如果是document类型的Uri,则通过document id处理            String docId = DocumentsContract.getDocumentId(uri);            if(uri.getAuthority().equals("com.android.providers.media.documents")) {                String id = docId.split(":")[1];// 解析出数字格式的id                String selection = MediaStore.Images.Media._ID + " = " + id;                imagePath = getImagePath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, selection);            } else if(uri.getAuthority().equals("com.android.providers.downloads.documents")) {                Uri contentUri = ContentUris.withAppendedId(                        Uri.parse("content://downloads/public_downloads"), Long.valueOf(docId));                imagePath = getImagePath(contentUri, null);            }        } else if(uri.getScheme().equalsIgnoreCase("content")) {            // 如果不是document类型的Uri,则使用普通方式处理            imagePath = getImagePath(uri, null);        }        displayImage(imagePath);// 根据图片路径显示图片    }
哇,是不是发现比4.4以下系统的代码多了很多,这是为什么呢??

之所以要这么做,是因为Android系统从4.4版本开始,选取相册中的图片分两种情况:返回图片真正的Uri,返回一个封装过的Uri,因此如果是4.4版本以上的手机就需要判断返回的uri是否是封装的Uri,如果是就需要对这个Uri进行解析才行。大家看下图。这就是从相册中选区照片的效果图。(华为手机)


当我们从最近、图片、下载内容中选取照片时返回的Uri是封装的Uri,我们必须进行解析

当我们从图库、文件管理中选取照片时返回的Uri是图片真正的Uri,我们不需要解析,像4.4以下系统那样处理就行了


其实之所以会有以api19为界限是因为我们用了Intent.ACTION_GET_CONENT这个action,我们可以换成Intent.ACTION_PICK,这样就不用以api19为界限了

 Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent.setType("image/*"); startActivityForResult(intent, CHOOSE_PHOTO);
这是我们启动从相册中获取图片的代码

如果我们将启动代码换成如下

Intent intent = new Intent(Intent.ACTION_PICK);intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");startActivityForResult(intent, CHOOSE_PHOTO);

这就是启动效果图,直接打开了图库,没有前面效果图复杂,无论是api19以下还是以上,返回的Uri都是图片真正的Uri







更多相关文章

  1. Android系统移植与调试之------->如何修改Android设备的默认休眠
  2. Android应用编程--基本概念
  3. Android(安卓)仿百度网页音乐播放器圆形图片转圈播放效果
  4. Android(安卓)StatFs类
  5. android 用LruCache读取大图片并缓存
  6. android 关于prop属性
  7. Android逐帧动画,逐帧动画加载图片过多时OOM异常的解决和替代方法
  8. Android:设计一个具有3个选项的菜单程序,单击每个选项时分别跳转
  9. 用ndk-build 编译C语言文件,生成可在android系统上运行的文件

随机推荐

  1. android中HttpURLConnection调用getRespo
  2. 初识ProgressBar
  3. android ndk Hello World
  4. Android读取xxx.properties配置文件中文
  5. Android使用HttpURLConnection访问网络
  6. 保持在底部的按钮栏,上面是滚动的ScrollVi
  7. Android(安卓)Socket&Cocos2dx的资料
  8. android studio 项目的版本问题
  9. Ubuntu下建立Android开发环境
  10. 【原版的:参赛作品】窥秘懒---android打开