android头像选择(拍照,相册,裁剪)

在做用户头像上传的时候,遇到了一个问题,就是在裁剪的时候,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;
		}
	}
}



demo点击下载:


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值