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