Android在选择系统相册图片时,返回的图片地址不同导致程序崩溃!!!

本文介绍了在Android应用中从系统相册选择图片时遇到的问题及解决方案,特别是在Android 4.4及以上版本中如何正确获取图片路径的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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



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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值