这是调用相机
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:
SetExtra |
DataType |
Description |
crop |
String |
Signalsthecropfeature |
aspectX |
int |
AspectRatio |
aspectY |
int |
AspectRatio |
outputX |
int |
widthofoutputcreatedfromthisIntent |
outputY |
int |
widthofoutputcreatedfromthisIntent |
scale |
boolean |
shoulditscale |
return-data |
boolean |
ReturnthebitmapwithAction=inline-databyusingthedata |
data |
Parcelable |
Bitmaptoprocess,youmayprovideitabitmap(nottested) |
circleCrop |
String |
ifthisstringisnotnull,itwillprovidesomecircularcr |
MediaStore.EXTRA_OUTPUT("output") |
URI |
SetthisURitoaFile:///,seeexamplecode |
最后把通过Uri获得bitmap的方法给大家贴上
publicstaticBitmapgetBitmapFromUri(Uriuri,ContextmContext)
{
try
{
//读取uri所在的图片
Bitmapbitmap=MediaStore.Images.Media.getBitmap(mContext.getContentResolver(),uri);
returnbitmap;
}
catch(Exceptione)
{
e.printStackTrace();
returnnull;
}
}