关于安卓图片剪切造成软件崩溃问题的解决方法
在项目编写过程中由于需要运用到图片的剪切处理,并在其中走了许多的弯路,浪费了很多的时间,再次对此问题的解决方法与各位分享一下,一方面能给遇到同样问题的小猿们提供更便捷更迅速的解决方法,另一方便也给自己加深下印象。
一般图片处理的几个步骤都是这样的:
- 调用摄像机
- 调用系统相册
- 调用系统剪切
// 调用系统相机
protected void startCamera(DialogInterface dialog) {
dialog.dismiss();
// 调用系统的拍照功能
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra("camerasensortype", 2); // 调用前置摄像头
intent.putExtra("autofocus", true); // 自动对焦
intent.putExtra("fullScreen", false); // 全屏
intent.putExtra("showActionIcons", false);
// 指定调用相机拍照后照片的存储路径
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(tempFile));
startActivityForResult(intent, PHOTO_CARMERA);
}
// 调用系统相册
protected void startPick(DialogInterface dialog) {
dialog.dismiss();
Intent intent = new Intent(Intent.ACTION_PICK, null);
intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
"image/*");
startActivityForResult(intent, PHOTO_PICK);
}
// 调用系统裁剪
private void startPhotoZoom(Uri uri, int size) {
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", size);
intent.putExtra("outputY", size);
// 设置是否返回数据
intent.putExtra("return-data", true);
startActivityForResult(intent, PHOTO_CUT);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case PHOTO_CARMERA:
if (null != data) {
startPhotoZoom(Uri.fromFile(tempFile), 300);
}
break;
case PHOTO_PICK:
if (null != data) {
startPhotoZoom(data.getData(), 300);
}
break;
case PHOTO_CUT:
if (null != data) {
setPicToView(data);
}
break;
default:
break;
}
super.onActivityResult(requestCode, resultCode, data);
}
但我们在真机上测试之后发现通过摄像机拍照,然后进入剪切步骤时有时会出现崩溃状况,而调用系统相册再剪切则不会。上网查了好多解决办法,有的甚至代码很复杂,确都没能很好的解决此问题。
在这里教大家一个简单粗暴的解决方式:
修改前:
修改后:
总结
经过反复试验,发现问题就是处在系统所给的uri上,那么我们就不用系统的获取uri的方法,直接将uri写死,并通过这个uri来获取需要剪切的图片。这样就不用去担心系统给的是file还是content的区别了。