三个常量,用来判断是相机、相册、还是裁剪后的回调(这里重点提醒下,Android根据URI去获取相册图片在4.4.4版本后是不一样的,所以如果Android版本在4.4.4以上就要去转换下uri,网上搜一下怎么转换吧)
private static final int PHOTO_CARMERA = 1;
private static final int PHOTO_PICK = 2;
private static final int PHOTO_CUT=3;
// 创建一个以当前系统时间为名称的文件,防止重复
private File tempFile = new File(Environment.getExternalStorageDirectory(),System.currentTimeMillis()+".jpg");
//从相册或相机返回Activity的回调
@Override
protected void onActivityResult(int arg0, int arg1, Intent arg2) {
if (arg1 == RESULT_OK) {
switch (arg0) {
case PHOTO_CARMERA://相机
startPhotoZoom(Uri.fromFile(tempFile), 300);//去裁剪
break;
case PHOTO_PICK://相册
if (null != arg2) {
startPhotoZoom(arg2.getData(), 300);//去裁剪
}
break;
case PHOTO_CUT://裁剪
if (null != arg2) {
setPicToView(arg2);//设置bitmap
}
break;
}
}
}
// 将裁剪后的图片显示在ImageView上
private void setPicToView(Intent data) {
Bundle bundle = data.getExtras();
if (null != bundle) {
final Bitmap bmp = bundle.getParcelable("data");
//TODO 你需要将bitmap显示在哪
}
}
protected void startCamera() {
// 调用系统的拍照功能
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));//这句话注意,如果Android版本高于7.0会报错,请看另一篇文档: 解决异常 android.os.FileUriExposedException
startActivityForResult(intent, PHOTO_CARMERA);
}
// 调用系统相册
protected void startPick() {
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);
}