第一行代码笔记——8.3.3 从相册中选择照片

在使用郭神的代码从相册选择照片时,发现在Android 5.1设备上存在不进入裁剪界面的问题。通过SegmentFault找到解决方案,修改了获取图片URI的方式,并添加了判断以避免TAKE_PHOTO错误。同时,注意到CROP_PHOTO前的代码在刷新imageUri时无用,可以注释掉。
摘要由CSDN通过智能技术生成

经过反复实验,确认了郭神的这段代码在我5.1的测试机上存在问题:选择完照片后没有进入裁剪,返回一片空白。

在https://segmentfault.com/q/1010000002513172这里找到了完美解决的方案。

但是答主没有给出充分的解释:

可以看到,为了获得

com.android.camera.action.CROP
必须进入TAKE_PHOTO。

而答主给出了这样一段:

if (data != null) {
    imageUri = data.getData();
}
CROP_PHOTO时在这段前后imageUri发生了变化:

由file:///storage/sdcard0/output_image.jpg变为了content://media/external/images/media/****

因为用户重新选取了图片,这里需要更新imaUri。没错。


但是!这样一来TAKE_PHOTO就是错的了啊!!!

data:"Intent{act=inline-data(has extras)}
很明显这样写还是不能完美解决问题。

所以加一句判断:

if (data != null &&  data.getData() != null) {
    imageUri = data.getData();
}
其实大家也觉得这样的改法实在很不好,但是因为我能力有限没敢重构这一段。也许可以用swich的穿透性提高重复代码的利用率。

最后一点——既然CROP_PHOTO时要刷新imageUri,但它在刷新前毫无作用。那么可以把源代码里的这一段注去:

  public void onClick(View v) {
//                File outputImage = new File(Environment.getExternalStorageDirectory(), "output_image.jpg");
//                try {
//                    if (outputImage.exists()) {
//                        outputImage.delete();
//                    }
//                    outputImage.createNewFile();
//                } catch (IOException e) {
//                    e.printStackTrace();
//                }
//                imageUri = Uri.fromFile(outputImage);
//                Intent intent = new Intent("android.intent.action.GET_CONTENT");
                Intent intent = new Intent("android.intent.action.PICK");
                intent.setType("image/*");
                intent.putExtra("crop", true);
                intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
                startActivityForResult(intent, TAKE_PHOTO);
//                startActivityForResult(intent, CROP_PHOTO);
            }
        });
这样一来就好多了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值