经过反复实验,确认了郭神的这段代码在我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); } });这样一来就好多了。
在使用郭神的代码从相册选择照片时,发现在Android 5.1设备上存在不进入裁剪界面的问题。通过SegmentFault找到解决方案,修改了获取图片URI的方式,并添加了判断以避免TAKE_PHOTO错误。同时,注意到CROP_PHOTO前的代码在刷新imageUri时无用,可以注释掉。
352

被折叠的 条评论
为什么被折叠?



