Android 对拍照、选照和剪切的封装

针对这个功能,一般app中都会需要这个功能,虽然简单,但是每次都要写不少的重复代码,因此对其进行了封装

  1. 权限需要拍照和读写SDCard的权限

  2. 布局就一个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);
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章