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

来源:互联网 发布:淘宝二楼是什么 编辑:程序博客网 时间:2024/06/06 02:50

经过反复实验,确认了郭神的这段代码在我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);            }        });
这样一来就好多了。

0 0
原创粉丝点击