项目中选择图片作为头像,都要经过剪裁的过程。一般我们都调用系统剪裁的方法。不过该方法在其它系统上都显示正常,但是在miui系统上就出错了。经测试发现其他系统
cropBitmap = data.getParcelableExtra("data");
方法都是有值的,而miui系统却没有。查资料发现miui系统默认的裁剪图片可能裁剪得过大,或对return-data分配的资源不足,造成return-data失败。
失败的剪裁方法如下:
Intent intent = new Intent("com.android.camera.action.CROP"); intent.setDataAndType(uri, "image/*"); // 下面这个crop=true是设置在开启的Intent中设置显示的VIEW可裁剪 intent.putExtra("crop", "true"); // aspectX aspectY 是宽高的比例 intent.putExtra("aspectX", 1); intent.putExtra("aspectY", 1); // outputX outputY 是裁剪图片宽高 intent.putExtra("outputX", 200); intent.putExtra("outputY", 200); intent.putExtra("outputFormat", Bitmap.CompressFormat.PNG.toString()); intent.putExtra("noFaceDetection", true); intent.putExtra("return-data", true); startActivityForResult(intent, REQUE_CODE_CROP);
解决方案:
剪裁后保存资源路径uri,在onActivityResult()方法中再提取uri图片转化成bitmap即可。
修改后的方法如下:
Intent intent = new Intent("com.android.camera.action.CROP"); intent.setDataAndType(uri, "image/*"); // 下面这个crop=true是设置在开启的Intent中设置显示的VIEW可裁剪 intent.putExtra("crop", "true"); // aspectX aspectY 是宽高的比例 intent.putExtra("aspectX", 1); intent.putExtra("aspectY", 1); // outputX outputY 是裁剪图片宽高 intent.putExtra("outputX", 200); intent.putExtra("outputY", 200); intent.putExtra("outputFormat", Bitmap.CompressFormat.PNG.toString()); intent.putExtra("noFaceDetection", true); /** * 此方法返回的图片只能是小图片(sumsang测试为高宽160px的图片) * 故只保存图片Uri,调用时将Uri转换为Bitmap,此方法还可解决miui系统不能return data的问题 */ // intent.putExtra("return-data", true); uritempFile = Uri.parse("file://" + "/" + Environment.getExternalStorageDirectory().getPath() + "/" + "small.jpg"); intent.putExtra(MediaStore.EXTRA_OUTPUT, uritempFile); startActivityForResult(intent, REQUE_CODE_CROP);
try { cropBitmap= BitmapFactory.decodeStream(getContentResolver().openInputStream(uritempFile)); } catch (FileNotFoundException e) { e.printStackTrace(); }
好了,这样就解决了,如果有更好的方法欢迎留言!