android照相、相册获取图片剪裁报错的解决方法
这是调用相机
	publicstaticFilegetImageFromCamer(Contextcontext,FilecameraFile,
			intREQUE_CODE_CAMERA,Intentintent){
		intent=newIntent(MediaStore.ACTION_IMAGE_CAPTURE);
		FilefileDir=HelpUtil.getFile(context,"/Tour/user_photos");
		cameraFile=newFile(fileDir.getAbsoluteFile()+"/"
				+System.currentTimeMillis()+".jpg");
		intent.putExtra(MediaStore.EXTRA_OUTPUT,Uri.fromFile(cameraFile));
		((Activity)context).startActivityForResult(intent,REQUE_CODE_CAMERA);
		returncameraFile;
	}
在这里我返回了一个file对象,这是应为项目中需要,大家可以不必真写,直接传一个Uri对象过来就好了
下面是调用相册
publicstaticvoidgetImageFromPhoto(Contextcontext,intREQUE_CODE_PHOTO){
		Intentintent=newIntent(Intent.ACTION_PICK,null);
		intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
				"image/*");
		((Activity)context).startActivityForResult(intent,REQUE_CODE_PHOTO);
	}
当然接下来是调用Activity的OnActivityResult了
	@Override
	protectedvoidonActivityResult(intrequestCode,intresultCode,Intentdata){
		if(resultCode==RESULT_OK){
			switch(requestCode){
			caseConstantUtil.REQUE_CODE_CAMERA:
				uri=Uri.fromFile(cameraFile);
				PhotoUtil.startPhotoZoom(context,uri,
						ConstantUtil.REQUE_CODE_CROP);
				break;
			caseConstantUtil.REQUE_CODE_PHOTO:
				if(null!=data){//为了取消选取不报空指针用的
					uri=data.getData();
					PhotoUtil.startPhotoZoom(context,uri,
							ConstantUtil.REQUE_CODE_CROP);
				}
				break;
			caseConstantUtil.REQUE_CODE_CROP:
				if(uri==null){
					break;
				}
				cropBitmap=HelpUtil.getBitmapFromUri(uri,context);
				if(cropBitmap!=null){
					iv_headphoto.setImageBitmap(cropBitmap);
					baos=newByteArrayOutputStream();
					cropBitmap.compress(Bitmap.CompressFormat.JPEG,100,baos);
					headPicString=newString(Base64.encode(
							baos.toByteArray(),0));
					UploadPic(headPicString);
				}
				break;
			default:
				break;
			}
		}
当然还有大家关心的剪切
publicstaticvoidstartPhotoZoom(Contextcontext,Uriuri,
			intREQUE_CODE_CROP){
		intdp=500;
		Intentintent=newIntent("com.android.camera.action.CROP");
		intent.setDataAndType(uri,"image/*");
		//下面这个crop=true是设置在开启的Intent中设置显示的VIEW可裁剪
		intent.putExtra("crop","true");
		intent.putExtra("scale",true);//去黑边
		intent.putExtra("scaleUpIfNeeded",true);//去黑边
		//aspectXaspectY是宽高的比例
		intent.putExtra("aspectX",1);//输出是X方向的比例
		intent.putExtra("aspectY",1);
		//outputXoutputY是裁剪图片宽高,切忌不要再改动下列数字,会卡死
		intent.putExtra("outputX",dp);//输出X方向的像素
		intent.putExtra("outputY",dp);
		intent.putExtra("outputFormat",Bitmap.CompressFormat.JPEG.toString());
		intent.putExtra("noFaceDetection",true);
		intent.putExtra(MediaStore.EXTRA_OUTPUT,uri);
		intent.putExtra("return-data",false);//设置为不返回数据
		((Activity)context).startActivityForResult(intent,REQUE_CODE_CROP);
	}
在很多博客中都把“return-data”设置为了true然后在onActivityResult中通过data.getParcelableExtra("data")来获取数据,不过这样的话dp这个变量的值就不能太大了,不然你的程序就挂了。这里也就是我遇到问题的地方了,在大多数高配手机上这样用是没有问题的,不过很多低配手机就有点hold不住了,直接就异常了,包括我们的国产神机米3也没能hold住,所以我建议大家不要通过returndata大数据,小数据还是没有问题的,说以我们在剪切图片的时候就尽量使用Uri这个东东来帮助我们。
下面是我们进行剪裁用到的一些参数
ExtaOptionsTableforimage/*crop:
最后把通过Uri获得bitmap的方法给大家贴上
publicstaticBitmapgetBitmapFromUri(Uriuri,ContextmContext)
	{
	try
	{
	//读取uri所在的图片
	Bitmapbitmap=MediaStore.Images.Media.getBitmap(mContext.getContentResolver(),uri);
	returnbitmap;
	}
	catch(Exceptione)
	{
	e.printStackTrace();
	returnnull;
	}
	}