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; }
到这为止,我又测试了小米手机,已经正常了,有时间还会在测试一些其他手机,如果没问题的话就不在增加此篇博文的内容,如有问题,我会及时修改并找到解决方法,告诉大家!!!