您的位置:首页 > 移动开发 > Android开发

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;
}


到这为止,我又测试了小米手机,已经正常了,有时间还会在测试一些其他手机,如果没问题的话就不在增加此篇博文的内容,如有问题,我会及时修改并找到解决方法,告诉大家!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐