针对这个功能,一般app中都会需要这个功能,虽然简单,但是每次都要写不少的重复代码,因此对其进行了封装
权限需要拍照和读写SDCard的权限
布局就一个Button和ImageView这里就不再写了
对于这个功能,用户只要拍照后的照片结果,其他他们并不会关心,所以我们只需要返回一个剪切后的照片给他们就OK了。这里用了回调接口来将剪切后的结果回传给用户
public OnPhotoResultCallback onPhotoResultCallback;
public void setOnPhotoResultCallback(
OnPhotoResultCallback onPhotoResultCallback) {
this.onPhotoResultCallback = onPhotoResultCallback;
}
// 照片剪切后的结果
public interface OnPhotoResultCallback {
void onResult(Intent data);
}
这里就是拍照,选照片和剪切的功能,就不再多说了,都有注释
/**
*
* @author oliver
*
*/
public class PhotoUtil {
private static final int REQUESTCODE_PICK = 1;
private static final int REQUESTCODE_TAKE = 2;
private static final int REQUESTCODE_CUTTING = 3;
private Uri imageUri;
private static PhotoUtil mPhotoUtil;
private PhotoUtil() {}
public static PhotoUtil getInstance() {
if (mPhotoUtil == null) {
synchronized (PhotoUtil.class) {
if (mPhotoUtil == null) {
mPhotoUtil = new PhotoUtil();
}
}
}
return mPhotoUtil;
}
/**
* 选照片
* @param activity
*/
public void pickPhoto(Activity activity) {
Intent pickIntent = new Intent(Intent.ACTION_PICK);
pickIntent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
"image/*");
activity.startActivityForResult(pickIntent, REQUESTCODE_PICK);
}
/**
* 拍照
* @param activity
*/
public void takePhoto(Activity activity) {
// 图片名称 时间命名
SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss",
Locale.CHINA);
Date date = new Date(System.currentTimeMillis());
String filename = format.format(date);
// 创建File对象用于存储拍照的图片 SD卡根目录
// File outputImage = new
// File(Environment.getExternalStorageDirectory(),test.jpg);
// 存储至DCIM文件夹
File path = Environment
.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);
File outputImage = new File(path, filename + ".jpg");
try {
if (outputImage.exists()) {
outputImage.delete();
}
outputImage.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
imageUri = Uri.fromFile(outputImage);
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); // 照相
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); // 指定图片输出地址
activity.startActivityForResult(intent, REQUESTCODE_TAKE); // 启动照相
}
/**
* 剪切照片
* @param activity
* @param uri
*/
public void startPhotoZoom(Activity activity, Uri uri) {
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(uri, "image/*");
intent.putExtra("crop", true);
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
intent.putExtra("outputX", 300);
intent.putExtra("outputY", 300);
intent.putExtra("return-data", true);
intent.putExtra("noFaceDetection", true);
activity.startActivityForResult(intent, REQUESTCODE_CUTTING);
}
/**
* 对返回结果的处理,此方法需要在activity的onActivityResult中调用
* @param activity
* @param requestCode
* @param resultCode
* @param data
*/
public void onActivityResult(Activity activity, int requestCode,
int resultCode, Intent data) {
if (resultCode != Activity.RESULT_OK) {
return;
}
switch (requestCode) {
case REQUESTCODE_PICK:// 选照片
startPhotoZoom(activity, data.getData());// 剪切功能
break;
case REQUESTCODE_TAKE:// 拍照
startPhotoZoom(activity, imageUri);// 剪切功能
break;
case REQUESTCODE_CUTTING:// 剪切结果
if (data != null) {
if (onPhotoResultCallback != null) {
onPhotoResultCallback.onResult(data);
}
}
break;
default:
break;
}
}
}
最后我们直接上封装后的代码,是不是感觉比之前少了很多代码,其实可以做很多扩展,这里就不再写了,需要的自行扩展吧。
这里写代码片
public class MainActivity extends ActionBarActivity{
private ImageView ivImage;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ivImage = (ImageView) findViewById(R.id.iv_image);
/**
* 拍照的结果
*/
PhotoUtil.getInstance().setOnPhotoResultCallback(new OnPhotoResultCallback() {
@Override
public void onResult(Intent data) {
setPicToView(data);
}
});
}
public void select(View view) {
AlertDialog.Builder builder = new Builder(this);
builder.setTitle("照片来源");
builder.setItems(new String[] { "拍照", "相册" },
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
switch (which) {
case 0:
PhotoUtil.getInstance().takePhoto(MainActivity.this);
break;
case 1:
PhotoUtil.getInstance().pickPhoto(MainActivity.this);
break;
}
}
});
builder.create().show();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
/**
* 将结果交给PhotoUtil处理
*/
PhotoUtil.getInstance().onActivityResult(this, requestCode, resultCode, data);
super.onActivityResult(requestCode, resultCode, data);
}
private void setPicToView(Intent picdata) {
Bundle extras = picdata.getExtras();
if (extras != null) {
Bitmap photo = extras.getParcelable("data");
Drawable drawable = new BitmapDrawable(getResources(), photo);
ivImage.setImageDrawable(drawable);
}
}
}