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