在做用户头像上传的时候,遇到了一个问题,就是在裁剪的时候,MIUI系统不行,程序直接崩溃了。
这里的解决方案是将裁剪后的图片保存起来。
private Uri mCropUri;
/**
* 剪切图片
*
* @param uri
*/
private void crop(Uri uri) {
// 裁剪图片意图
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(uri, "image/*");
intent.putExtra("crop", "true");
// 裁剪框的比例,1:1
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
int iamgeSize = (int) mActivity.getResources().getDimension(
R.dimen.photo_size);
// 裁剪后输出图片的尺寸大小
intent.putExtra("outputX", iamgeSize);
intent.putExtra("outputY", iamgeSize);
// 图片格式
intent.putExtra("outputFormat", "JPEG");
intent.putExtra("noFaceDetection", true);// 取消人脸识别
//此方法在miui中返回异常奔溃了
// intent.putExtra("return-data", true);// true:返回uri,false:不返回uri
//替代上面的方法,解决miui异常奔溃
mCropUri = Uri.parse("file://" + "/"
+ Environment.getExternalStorageDirectory().getPath() + "/"
+ "crop_temp.jpg");
intent.putExtra(MediaStore.EXTRA_OUTPUT, mCropUri);
intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
mActivity.startActivityForResult(intent, PHOTO_REQUEST_CUT);
}
完整封装:
/**
* 图片选择
*
* @author peifen
* @date 2015-9-5 上午1:04:05
*/
public class ImageSelectHolder {
// 相册
private final int PHOTO_PICKED_WITH_DATA = 0x100;
// 照相机
private final int CAMERA_WITH_DATA = 0x101;
// 裁剪
private final int PHOTO_REQUEST_CUT = 0x102;
// 拍摄的临时文件
private File mTempFile = new File(
Environment.getExternalStorageDirectory(), "temp_shoot.jpg");
private Activity mActivity;
private ImageSelectHolder(Activity activity) {
mActivity = activity;
}
public static ImageSelectHolder newInstance(Activity activity) {
return new ImageSelectHolder(activity);
}
/**
* 弹出选择方式
*/
public void open() {
new AlertDialog.Builder(mActivity)
.setItems(new String[] { "相机拍摄", "手机相册" },
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
switch (which) {
case 0:
// 相机拍摄
camera();
break;
case 1:
// 手机相册
album();
break;
}
}
}).create().show();
}
/**
* 相机拍摄
*/
private void camera() {
String status = Environment.getExternalStorageState();
if (!status.equals(Environment.MEDIA_MOUNTED)) {// 判断是否有SD卡
Toast.makeText(mActivity, "没有找到SD卡或者正在使用请关闭usb连接模式",
Toast.LENGTH_LONG).show();
return;
}
try {
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(mTempFile));
mActivity.startActivityForResult(intent, CAMERA_WITH_DATA);
} catch (Exception e) {
Toast.makeText(mActivity, "没有找到相机", Toast.LENGTH_LONG).show();
e.printStackTrace();
}
}
/**
* 手机相册
*/
private void album() {
if (!hasSdcard()) {// 判断是否有SD卡
Toast.makeText(mActivity, "没有找到SD卡或者正在使用请关闭usb连接模式",
Toast.LENGTH_LONG);
return;
}
try {
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
"image/*");
mActivity.startActivityForResult(intent, PHOTO_PICKED_WITH_DATA);
} catch (Exception e) {
Toast.makeText(mActivity, "没有找到相册", Toast.LENGTH_LONG).show();
e.printStackTrace();
}
}
private Uri mCropUri;
/**
* 剪切图片
*
* @param uri
*/
private void crop(Uri uri) {
// 裁剪图片意图
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(uri, "image/*");
intent.putExtra("crop", "true");
// 裁剪框的比例,1:1
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
int iamgeSize = (int) mActivity.getResources().getDimension(
R.dimen.photo_size);
// 裁剪后输出图片的尺寸大小
intent.putExtra("outputX", iamgeSize);
intent.putExtra("outputY", iamgeSize);
// 图片格式
intent.putExtra("outputFormat", "JPEG");
intent.putExtra("noFaceDetection", true);// 取消人脸识别
//此方法在miui中返回异常奔溃了
// intent.putExtra("return-data", true);// true:返回uri,false:不返回uri
//替代上面的方法,解决miui异常奔溃
mCropUri = Uri.parse("file://" + "/"
+ Environment.getExternalStorageDirectory().getPath() + "/"
+ "crop_temp.jpg");
intent.putExtra(MediaStore.EXTRA_OUTPUT, mCropUri);
intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
mActivity.startActivityForResult(intent, PHOTO_REQUEST_CUT);
}
/**
* 结果处理
*
* @param requestCode
* @param resultCode
* @param data
* @param iv
*/
public void onActivityResultDispose(int requestCode, int resultCode,
Intent data, ImageView iv) {
if (requestCode == PHOTO_PICKED_WITH_DATA) {
if (data != null) {
// 得到图片的全路径
Uri uri = data.getData();
crop(uri);
}
} else if (requestCode == CAMERA_WITH_DATA) {
if (hasSdcard()) {
crop(Uri.fromFile(mTempFile));
} else {
Toast.makeText(mActivity, "未找到存储卡,无法存储照片!", Toast.LENGTH_LONG)
.show();
}
} else if (requestCode == PHOTO_REQUEST_CUT) {
try {
if(mCropUri == null){
Toast.makeText(mActivity, "裁剪图片失败!",Toast.LENGTH_LONG).show();
return;
}
// Bitmap photoBitmap = data.getParcelableExtra("data");
Bitmap photoBitmap = BitmapFactory.decodeStream(mActivity
.getContentResolver().openInputStream(mCropUri));
iv.setImageBitmap(photoBitmap);
} catch (Exception e) {
e.printStackTrace();
} finally{
if (mTempFile != null && mTempFile.exists()) {
mTempFile.delete();
}
if(mCropUri!=null){
File cropFile = new File(mCropUri.getPath());
if(cropFile!=null && cropFile.exists()){
cropFile.delete();
}
}
}
}
}
/**
* 判断是否有外部存储卡
* @return
*/
private boolean hasSdcard() {
if (Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) {
return true;
} else {
return false;
}
}
}