Android在选择系统相册图片时,返回的图片地址不同导致程序崩溃!!!
2016-09-20 13:52
357 查看
1.简介
在做选择系统图片的时候,碰到了一个情况,由于不同的android手机,图片的路径很多都不同,我运行在奇虎手机上的时候,出现了崩溃,下面是我打开系统相册的方法:请注意红色字体:Intent intent = new Intent(); intent.setType("image/*"); intent.setAction(Intent.ACTION_GET_CONTENT); startActivityForResult(intent, REQUEST_CODE_IMAGE);
在Android系统4.4之前调用这个ACTION是没有错误的,但是在4.4以后就不行了,原因在于4.4之前和之后返回的uri已经不是同一个了,之前的uri包含了文件的绝对路径,是有"_data"的,但是之后的uri已经没有这个字段了,它返回的只是一个相对的编号,所以根本就拿不到,于是就崩溃了!
那么4.4之后的ACTION应该是什么呢:intent.setAction(Intent.ACTION_PICK);就是这个,把上面的红色部分修改成这个,就不会报错了,修改之后再通过下面的方法得到图片在手机上的路径:
Uri uri = data.getData(); String[] pojo = {MediaStore.Images.Media.DATA}; ImageView imageView = new ImageView(this); ContentResolver cr = this.getContentResolver(); Cursor c= cr.query(uri, null, null, null, null); c.moveToFirst(); //这是获取的图片保存在sdcard中的位置 int colunm_index = c.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); String srcPath = c.getString(colunm_index); fileImage = new File(srcPath);
这样就可以得到图片文件了!
2.ACTION修改之后还是报了错
上面修改intent的ACTION之后,我测了好几个手机都能够正常运行,可是当运行在我的小米手机上的时候,又出现了错误,具体的错误记不太清楚了,也是类似空指针一样的错误,我搜了很多资料都没有找到解决问题的方法,可是我在做轮播图的时候,无意中发现了解决问题的方法,总结一下出现问题的原因:一个android文件的Uri地址一般如下:
content://media/external/images/media/62026
可是也有以“file”开头的文件系统路径,出现错误的原因就在这,上面的方法只能够解析出以content开头的图片路径,却不能查找到fie开头的图片,所以解决办法就是在得到图片路径之前加上判断,判断得到的uri是以什么开头的,判断的方法是:uri.getScheme().equals("file");通过这个方法来判断得到的uri是以什么开头的,在进行路径的拼接和查找,具体实现如下代码:
//获取图片地址 if ((resultCode == RESULT_OK) && (requestCode == REQUEST_CODE_IMAGE)) { Uri uri = data.getData(); String[] pojo = {MediaStore.Images.Media.DATA}; ImageView imageView = new ImageView(this); ContentResolver cr = this.getContentResolver(); Cursor c=null; if(uri.getScheme().equals("content")) {//判断uri地址是以什么开头的 c= cr.query(uri, null, null, null, null); }else{ c= cr.query(getFileUri(uri), null, null, null, null);//红色字体判断地址如果以file开头 } c.moveToFirst(); //这是获取的图片保存在sdcard中的位置 int colunm_index = c.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); String srcPath = c.getString(colunm_index); fileImage = new File(srcPath); } //下面是红色字体的方法内容
public Uri getFileUri(Uri uri){ if (uri.getScheme().equals("file")) { 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(MediaStore.Images.ImageColumns.DATA) .append("=") .append("'" + path + "'") .append(")"); Cursor cur = cr.query( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, new String[] { MediaStore.Images.ImageColumns._ID }, buff.toString(), null, null); int index = 0; for (cur.moveToFirst(); !cur.isAfterLast(); cur .moveToNext()) { index = cur.getColumnIndex(MediaStore.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; } } } } return uri; }
到这为止,我又测试了小米手机,已经正常了,有时间还会在测试一些其他手机,如果没问题的话就不在增加此篇博文的内容,如有问题,我会及时修改并找到解决方法,告诉大家!!!
相关文章推荐
- Android 4.4从图库选择图片并裁剪,由于系统版本不同导致Uri的bug的简单解决方式
- Android 4.4从图库选择图片并裁剪,由于系统版本不同导致Uri的bug的几种解决方案
- android 4.4版本以上系统相册图片返回URI的不同处理
- 【转】 解决通过Intent调用系统拍照程序,返回图片太小的问题[android]
- android2.3选择相册图片或者调用系统照相
- android 调用系统相册选取照片或者打开相机拍照获取图片,返回时为什么会回到home界面或者到前一个界面,然后才会跳转到当前activity
- Android调用系统相册选择图片,支持小米4云相册
- android 拍照+从手机相册选择返回图片到imagview
- Android 根据URI获取图片(从相册选择图片后返回)
- 【Android】调用系统相册选择图片
- 选择相册照片并且显示(拿到返回的图片地址)
- Android拍照调用系统相册仿微信封装总结,治疗各种崩溃,图片横竖问题压缩等问题。-更新2016-12-21
- Android 获得选择的系统相册图片
- android进入系统相册选择图片
- Android 调用系统相册选择图片并显示
- android 开启本地相册选择图片并返回显示
- Android 打开相册,选择一张图片并返回
- android调用系统拍照程序和从图库选取图片,返回后调用系统裁剪工具
- Android调用系统相册和相机选择图片并显示在imageview中
- Android调用相机拍照并返回路径和调用系统图库选择图片