Android自定義相機

public class CameraActivity extends BaseActivity implements View.OnClickListener {
    //存放路徑
    public static final String UPLOAD_PATH = Constants.SDCARD_PATH
            + "upload/claim/";
    public static final int MASK_NULL = 0;//不設置蒙版
    public static final int MASK_FRONT = 1;//全車拍照
    public static final int MASK_FRAME = 2;//車架號
    public static final int MASK_OBJECT = 3;//損失物拍照
    private static int maskType = MASK_NULL;//默認

    private int position; // 需要拍照的坑位編號 1 - 8
    private String uri;

    private Camera camera;
    private CameraHelper mCameraHelper;
    private Camera.Parameters parameters = null;
    private Camera.Size previewSize = null;
    private int screenWidth;
    private int screenHeight;
    private static final String NOT_AUTO_FOCUS = "fixed__";// 定焦
    private String autofocusType = NOT_AUTO_FOCUS;// -1表示不支持
    private static final String FOCUS_MODE_CONTINUOUS_PICTURE = "continuous-picture";
    private boolean isFlashOpen ;
    private String mFilePath;//保存文件的路徑
    private ImageButton btn_flash;//閃關燈
    private ImageButton btn_takephoto;//拍照
    private View layout_takepic_con;
    private View layout_take_finish;
    private OrientationEventListener mOrientationListener;
    private int  mScreenExifOrientation = 0;
    private ImageView mImageMask ;//拍照蒙版
    private TextView tips_top;//上面的提示
    private TextView tips_bottom;//底部提示

    private File mJpgFile;//拍照的圖片


    /**
     *設置蒙版 類型
     * @param type MASK_FRONT MASK_FRAME  MASK_NULL
     */
    public static void setMaskType(int type){
        maskType = type;
    }

    private boolean isFromGallery;
    private boolean isFromUploadPage;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        int pageNumber = 1;
        DisplayMetrics metrics = getResources().getDisplayMetrics();
        Intent i = getIntent();
        position = i.getIntExtra("position", -1);
        initMasks(position);
        uri = i.getStringExtra("uri");
        isFromGallery=i.getBooleanExtra("isFromGallery", false);
        isFromUploadPage=isFromUploadPage(i.getBooleanExtra("isFromUploadPage", false),!TextUtils.isEmpty(uri));
        if (TextUtils.isEmpty(uri)) {
            gotoShootingView();
        } else {
            Bitmap bm = PathTurnUtils.getBitmap(uri, metrics.widthPixels, metrics.heightPixels);
            gotoPreviewView(bm);
        }
    }

    //判斷是從上傳圖片頁面跳轉切已選擇圖片
    private boolean isFromUploadPage(boolean FromUploadPage,boolean getUri){
        return FromUploadPage && getUri;
    }
    private void initMasks(int position) {
        if (position == 0) {
            maskType = MASK_FRONT;
        } else {
            maskType = MASK_NULL;
        }
    }

    @Override
    protected void onDestroy() {
        if (mOrientationListener != null) {
            mOrientationListener.disable();
        }
        if (MessageDialogUtil.isShow()) {
            MessageDialogUtil.dismissAlertDialog();
        }
        super.onDestroy();
    }

    private void gotoFirstView(int pageNumber) {
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        setContentView(R.layout.activity_camera_firstpage);
        ImageView main = (ImageView) findViewById(R.id.iv_main);
        if (!TextUtils.isEmpty(uri)) {
            Bitmap bm = null;
            main.setImageBitmap(bm);
        } else {
            main.setImageResource(ImageResource.get(position));
        }
        ImageView back = (ImageView) findViewById(R.id.iv_back);
        back.setOnClickListener(this);
        TextView shoot = (TextView) findViewById(R.id.tv_shoot);
        shoot.setOnClickListener(this);
    }

    private void gotoShootingView(){
        mOrientationListener = new OrientationEventListener(this) {
            @Override
            public void onOrientationChanged(int i) {
                if(45 <= i && i < 135) {
                    mScreenExifOrientation = 180;
                } else if(135 <= i && i < 225) {
                    mScreenExifOrientation = 270;
                } else if(225 <= i && i < 315) {
                    mScreenExifOrientation = 0;
                } else {
                    mScreenExifOrientation = 90;
                }
            }
        };
        mOrientationListener.enable();
        // 顯示界面
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
        setContentView(R.layout.camera_layout);
        SurfaceView surfaceView = (SurfaceView) this.findViewById(R.id.SurfaceView01);
        surfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        surfaceView.getHolder().setKeepScreenOn(true);
        surfaceView.getHolder().addCallback(new SurfaceCallback());

        // 方法1 Android獲得屏幕的寬和高
        WindowManager windowManager = getWindowManager();
        Display display = windowManager.getDefaultDisplay();
        screenWidth  = display.getWidth();
        screenHeight = display.getHeight();
        mCameraHelper = new CameraHelper(this);
        try {
            Uri mUri = getIntent().getExtras().getParcelable(MediaStore.EXTRA_OUTPUT);// localIntent.putExtra(MediaStore.EXTRA_OUTPUT,
            // imageUriFromCamera);
            mFilePath = UriUtils.getPath(this, mUri);
        }catch (Exception e){
            e.printStackTrace();
        }

        btn_flash = (ImageButton) findViewById(R.id.btn_flash);
        btn_flash.setOnClickListener(mListener);
        btn_takephoto = (ImageButton) findViewById(R.id.btn_takephoto);
        btn_takephoto.setOnClickListener(mListener);
        if(isSurportFlash()){
            btn_flash.setVisibility(View.VISIBLE);
        }else{
            btn_flash.setVisibility(View.INVISIBLE);
        }
        layout_takepic_con = findViewById(R.id.layout_takepic_con);
        layout_take_finish = findViewById(R.id.layout_take_finish);
        mImageMask = (ImageView) findViewById(R.id.img_mask);

        tips_top = (TextView) findViewById(R.id.tv_tips_top);
        tips_bottom = (TextView) findViewById(R.id.tv_tips_bottom);


        switch(maskType){
            case MASK_FRONT:
                mImageMask.setImageResource(R.drawable.car_mask);
                tips_top.setText(R.string.camera_tips_all);
                tips_top.setVisibility(View.VISIBLE);
                break;
//            case MASK_FRAME:
//                mImageMask.setImageResource(R.drawable.car_mask_frame);
//                tips_top.setText(R.string.camera_tips_frame);
//                break;
//            case MASK_OBJECT:
//                mImageMask.setImageResource(R.drawable.car_mask);
//                tips_top.setText(R.string.camera_tips_object);
//                tips_top.setVisibility(View.VISIBLE);
//                break;
            default:
                mImageMask.setImageDrawable(null);
                tips_top.setText("");
                break;


        }
    }

    private void gotoPreviewView(Bitmap result) {
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        setContentView(R.layout.activity_camera_preview);
        ImageView i = (ImageView) findViewById(R.id.iv_main_picture);
        ImageView delete = (ImageView) findViewById(R.id.tv_camera_delete);
        ImageView back = (ImageView) findViewById(R.id.iv_back);
        back.setOnClickListener(this);
        delete.setVisibility(View.GONE);
        i.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
        i.setImageBitmap(result);
        final ImageView s = (ImageView) findViewById(R.id.iv_standard);
        final ViewGroup compare = (ViewGroup) findViewById(R.id.rl_compare);
        if ((position >=0 && position <=3) || (position >= 100 && position <= 103)) {
            s.setImageResource(ImageResource.get(position));
            TextView title = (TextView) findViewById(R.id.tv_title);
            title.setText(getTitle(position));
            compare.setVisibility(View.VISIBLE);
            compare.setOnTouchListener(new View.OnTouchListener() {
                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    int action = event.getAction();
                    if (action == MotionEvent.ACTION_DOWN) {
                        s.setVisibility(View.VISIBLE);
                    } else if (action == MotionEvent.ACTION_UP) {
                        s.setVisibility(View.GONE);
                    }
                    return true;
                }
            });
        } else {
            s.setVisibility(View.GONE);
            compare.setVisibility(View.GONE);
            delete.setVisibility(View.VISIBLE);
        }
        ViewGroup use = (ViewGroup) findViewById(R.id.rl_use);
        ViewGroup retake = (ViewGroup) findViewById(R.id.rl_retake);
        use.setOnClickListener(this);
        retake.setOnClickListener(this);
        delete.setOnClickListener(this);
    }

    private String getTitle(int position) {
        String[] titlesA = {"全車圖片", "損失遠景", "損失近景", "損失細節"};
        String[] titlesB = {"被保人身份證", "行駛證", "駕駛證", "被保人銀行卡"};
        if (position >=0 && position <= 3) {
            return titlesA[position];
        } else if (position >= 100 && position <= 103) {
            return titlesB[position - 100];
        }
        return "其他";
    }

    /**
     * *****************************************************************
     * 對重拍彈dialog的修改
     *
     */
    private OnDeletePhotoListener deletePhotoListener = null;

    public interface OnDeletePhotoListener {
        public void onDeletePhotoListener();
    }
    private void createDirIfNotExist(final String uploadPath) {
        File out = new File(uploadPath);
        if (!out.exists()) {
            out.mkdirs();
        }
    }
    private void usePhoto() {
        Intent headimg = new Intent(Intent.ACTION_PICK, null);
        headimg.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                "image/*");
        startActivityForResult(headimg, ClaimLossCertyChatAcitivty.RequestCode.GALLERY.ordinal());
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if(data==null){
            return;
        }
        if (requestCode ==ClaimLossCertyChatAcitivty.RequestCode.GALLERY.ordinal()){
            Uri galleryUri = data.getData();
            if (galleryUri == null) {
                return;
            }
            uri= UriUtils.getPath(this, galleryUri);
            DisplayMetrics metrics = getResources().getDisplayMetrics();
            Bitmap bm = PathTurnUtils.getBitmap(uri, metrics.widthPixels, metrics.heightPixels);
            gotoPreviewView(bm);
        }
    }
    /**
     * ********************************************
     */
    private PicturePickerDialog pickerDialog;
    public void onButtonClick(View v){
        switch (v.getId()) {
            case R.id.btn_repeat:// 重拍
                if(camera != null){
                    camera.startPreview(); // 拍完照後,重新開始預覽
                }
                showTakePicorFinish(true);
                break;
            case  R.id.btn_confirm://確認
                setResult(RESULT_OK);
                finish();
                break;

            case R.id.btn_return://返回
                setResult(RESULT_CANCELED);
                finish();
                break;
            default:break;
        }
    }

    /**
     * 創建圖片文件名
     * @return
     */
    private String createImgName() {
        StringBuffer sb = new StringBuffer();
        sb.append(Preferences.getInstance(getApplicationContext()).getUid())
                .append("_").append(AutoClaimUtils.getAutoClaimCaseId()).append("_")
                .append(System.currentTimeMillis()).append(".jpg");
        return sb.toString();
    }
    /**
     * 彈窗提示,是否要刪除該照片
     */
    private void showIsDeletePic() {
        MessageDialogUtil.showAlertDialog(this, "溫馨提示", "確定刪除這張照片嗎?", "是的", "取消");
        MessageDialogUtil.setLeftListener(new MessageDialogUtil.OnLeftListener() {

            @Override
            public void onClick() {
                mJpgFile.delete();
                Intent back = new Intent();
                back.putExtra("uri", "");
                back.putExtra("position", position);
                setResult(RESULT_OK, back);
                finish();
            }
        });
    }

    /**
     *
     * @param istrue true 顯示 拍照 按鈕  false 顯示拍照完成 按鈕
     */
    private void showTakePicorFinish(boolean istrue){
        if(istrue){
            layout_takepic_con.setVisibility(View.VISIBLE);
            mImageMask.setVisibility(View.VISIBLE);
            layout_take_finish.setVisibility(View.GONE);
            tips_bottom.setVisibility(View.VISIBLE);
            tips_top.setVisibility(View.VISIBLE);
        }else{
            layout_takepic_con.setVisibility(View.GONE);
            layout_take_finish.setVisibility(View.VISIBLE);
            mImageMask.setVisibility(View.INVISIBLE);
            tips_bottom.setVisibility(View.INVISIBLE);
            tips_top.setVisibility(View.INVISIBLE);
        }

    }

    private View.OnClickListener mListener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (camera != null) {
                switch (v.getId()) {
                    case R.id.btn_takephoto:// 拍照
                        takePic();
                        break;
                    case R.id.btn_flash:
                        btn_flash.setSelected(!btn_flash.isSelected());
                        setFlashOn(btn_flash.isSelected());
                        break;

                    default:break;
                }
            }
        }
    };

    /**
     * 拍照處理
     */
    private void takePic(){
        if (autofocusType.contains(FOCUS_MODE_CONTINUOUS_PICTURE)) {

            if (android.os.Build.VERSION.SDK_INT == 15) {// 適配HTC HTC
                // T320e拍照BUG
                try {
                    camera.autoFocus(new Camera.AutoFocusCallback() {
                        @Override
                        public void onAutoFocus(final boolean success, final Camera camera) {
                            camera.takePicture(null, null, new MyPictureCallback());

                        }
                    });
                } catch (Exception e) {
                    camera.takePicture(null, null, new MyPictureCallback());
                }
            } else {
                camera.takePicture(null, null, new MyPictureCallback());
            }
        } else if (autofocusType.contains(Camera.Parameters.FOCUS_MODE_AUTO)) {
            camera.autoFocus(new Camera.AutoFocusCallback() {

                @Override
                public void onAutoFocus(final boolean success, final Camera camera) {
                    // camera.cancelAutoFocus();//只有加上了這一句,纔會自動對焦。
                    if (success) {
                        camera.takePicture(null, null, new MyPictureCallback());
                    } else {

                        Toast.makeText(getApplicationContext(), "拍照失敗",
                                Toast.LENGTH_SHORT).show();
                        }
                    }
            });
        } else {
            camera.takePicture(null, null, new MyPictureCallback());
        }
    }

    /**
     * 開關 閃光燈
     *
     * @param isOn
     */
    private void setFlashOn(boolean isOn) {
        if(camera != null ) {
            isFlashOpen = isOn;
            Camera mCamera = camera;
            if (isFlashOpen) {
                if (mCamera != null) {
                    Camera.Parameters parameters = mCamera.getParameters();
                    parameters.setFlashMode(Camera.Parameters.FLASH_MODE_ON);
                    mCamera.setParameters(parameters);
                }
            } else {
                if (mCamera != null) {
                    Camera.Parameters parameters = mCamera.getParameters();
                    parameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
                    mCamera.setParameters(parameters);
                }
            }
        }
    }

    /**
     * 檢測是否支持閃光燈
     * @return
     */
    public boolean isSurportFlash() {
        PackageManager pm = this.getPackageManager();
        FeatureInfo[] features = pm.getSystemAvailableFeatures();
        for (FeatureInfo f : features) {
            if (PackageManager.FEATURE_CAMERA_FLASH.equals(f.name)){ // 判斷設備是否支持閃光燈
                return true;
            }
        }
        return false;
    }


    @Override
    public void onClick(View v) {
        int id = v.getId();
        switch (id) {
            case R.id.iv_back:
                finish();
                break;
            case R.id.tv_shoot:
                gotoShootingView();
                break;
            case R.id.rl_use:
                Intent back = new Intent();
                back.putExtra("uri", uri);
                back.putExtra("position", position);
                setResult(RESULT_OK, back);
                finish();
                break;
            case R.id.tv_camera_delete://點擊刪除按鈕
                showIsDeletePic();
                break;
            case R.id.rl_retake:
               if(!isFromUploadPage) {
                   if (!isFromGallery) {
                       gotoShootingView();
                   } else {
                       usePhoto();
                   }
               }else{
//                gotoShootingView();
                //TODO:彈dialog顯示拍照還是從相冊選擇
                if (pickerDialog == null) {
                    pickerDialog = new PicturePickerDialog(
                            CameraActivity.this,
                            new PicturePickerDialog.IRequestCode() {

                                @Override
                                public int photoCode() {
                                    return ClaimLossCertyChatAcitivty.RequestCode.GALLERY.ordinal();
                                }

                                @Override
                                public int cameraCode() {
                                    CameraActivity.setMaskType(CameraActivity.MASK_NULL);
                                    return ClaimLossCertyChatAcitivty.RequestCode.CAMERA.ordinal();
                                }
                            }){
                        public void showPickDialog(final String uploadPath, final String filename,
                                                   boolean delete) {
                            String shareDialogTitle = CameraActivity.this
                                    .getString(R.string.pick_dialog_title);
                            if (!delete) {
                                MMAlert.showAlert(CameraActivity.this, shareDialogTitle, CameraActivity.this
                                                .getResources().getStringArray(R.array.picks_pics_item),
                                        null, new MMAlert.OnAlertSelectId() {
                                            @Override
                                            public void onClick(int whichButton) {
                                                switch (whichButton) {
                                                    case 0: // 拍照
                                                        createDirIfNotExist(uploadPath);
//                                                       useCamera(uploadPath, filename);
                                                        isFromUploadPage=false;
                                                        isFromGallery=false;
                                                        gotoShootingView();
                                                        break;
                                                    case 1: // 相冊
                                                        createDirIfNotExist(uploadPath);
                                                        isFromUploadPage=false;
                                                        isFromGallery=true;
                                                        usePhoto();
                                                        break;
                                                }
                                            }
                                        });
                            } else {
                                MMAlert.showAlert(
                                        CameraActivity.this,
                                        shareDialogTitle,
                                        CameraActivity.this.getResources().getStringArray(
                                                R.array.picks_pics_delete_item), null,
                                        new MMAlert.OnAlertSelectId() {
                                            @Override
                                            public void onClick(int whichButton) {
                                                switch (whichButton) {
                                                    case 0:
                                                        if (deletePhotoListener != null) {
                                                            deletePhotoListener.onDeletePhotoListener();
                                                        }
                                                        break;
                                                    case 1: // 拍照
                                                        createDirIfNotExist(uploadPath);
//                                                      useCamera(uploadPath, filename);
                                                        isFromUploadPage=false;
                                                        isFromGallery=false;
                                                        gotoShootingView();
                                                        break;
                                                    case 2: // 相冊
                                                        createDirIfNotExist(uploadPath);
                                                        isFromUploadPage=false;
                                                        isFromGallery=true;
                                                        usePhoto();
                                                        break;
                                                }
                                            }
                                        });
                            }
                        }
                    };
                }
                pickerDialog.setType(true);
                pickerDialog.showPickDialog(UPLOAD_PATH, createImgName(), false);
 }
                break;
        }
    }

    private final class MyPictureCallback implements Camera.PictureCallback {

        @Override
        public void onPictureTaken(byte[] data, Camera camera) {
            try {
                if(camera != null ){
                    camera.stopPreview();
                }
                Bitmap bMapRotate = null;
                Bitmap  bMap = BitmapFactory.decodeByteArray(data, 0, data.length);

                if(mScreenExifOrientation == 90){
                    Matrix matrix = new Matrix();
                    matrix.reset();
                    matrix.postRotate(0);
                    bMapRotate = Bitmap.createBitmap(bMap, 0, 0, bMap.getWidth(), bMap.getHeight(), matrix, true);
                }else if(mScreenExifOrientation == 270){
                    Matrix matrix = new Matrix();
                    matrix.reset();
                    matrix.postRotate(180);
                    bMapRotate = Bitmap.createBitmap(bMap, 0, 0, bMap.getWidth(), bMap.getHeight(), matrix, true);
                }else if (mScreenExifOrientation != 0) {
                    Matrix matrix = new Matrix();
                    matrix.reset();
                    matrix.postRotate(mScreenExifOrientation);
                    bMapRotate = Bitmap.createBitmap(bMap, 0, 0, bMap.getWidth(), bMap.getHeight(), matrix, true);
                } else {
                    bMapRotate = bMap;
                }

                if(bMapRotate != null) {
                    ByteArrayOutputStream baos = new ByteArrayOutputStream();
                    bMapRotate.compress(Bitmap.CompressFormat.JPEG, 80, baos);
                    data = baos.toByteArray();
                    baos.close();
                }
                saveToSDCard(data); // 保存圖片到sd卡中
                gotoPreviewView(bMapRotate);
            } catch (Exception e) {
                e.printStackTrace();
                Toast.makeText(getApplicationContext(), "拍照失敗", Toast.LENGTH_SHORT).show();
            }
        }
    }

    /**
     * 將拍下來的照片存放在SD卡中
     * @param data
     * @throws IOException
     */
    public void saveToSDCard(byte[] data) throws IOException {
        Date date = new Date();
        SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss"); // 格式化時間
        String filename = format.format(date) + ".jpg";
        File fileFolder = new File(Environment.getExternalStorageDirectory() + "/carowner/");
        if (!fileFolder.exists()) {
            fileFolder.mkdir();
        }
        if(TextUtils.isEmpty(mFilePath)){
            mJpgFile = new File(fileFolder, filename);
        }else{
            mJpgFile = new File(mFilePath);
        }

        FileOutputStream outputStream = new FileOutputStream(mJpgFile); // 文件輸出流
        outputStream.write(data); // 寫入sd卡中
        outputStream.close(); // 關閉輸出流
        uri = mJpgFile.getAbsolutePath();
    }

    /**
     * 像是相機錯誤對話框
     */
    private void  ShowErrorDialog(){
            if (!MessageDialogUtil.isShow()){
                MessageDialogUtil.showAlertDialog(this, getString(R.string.dialog_defalut_title), "相機打開失敗,請檢查系統權限設置。","確定",null);
            }
            MessageDialogUtil.setLeftListener(new MessageDialogUtil.OnLeftListener() {
                @Override
                public void onClick() {
                    MessageDialogUtil.dismissAlertDialog();
                    finish();
                }
            });

    }

    private final class SurfaceCallback implements SurfaceHolder.Callback {
        // 拍照狀態變化時調用該方法
        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width,
                                   int height) {

        }

        // 開始拍照時調用該方法
        @Override
        public void surfaceCreated(SurfaceHolder holder) {
            showTakePicorFinish(true);
            try {
                camera = mCameraHelper.openBackCamera(); // 打開攝像頭
                initParameters(camera.getParameters());
                camera.setPreviewDisplay(holder); // 設置用於顯示拍照影像的SurfaceHolder對象
                camera.setDisplayOrientation(getPreviewDegree(CameraActivity.this));
                camera.startPreview(); // 開始預覽
            } catch (Exception e) {
                e.printStackTrace();
                ShowErrorDialog();
            }

        }

        // 停止拍照時調用該方法
        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
            if (camera != null) {
                camera.release(); // 釋放照相機
                camera = null;
            }
        }
    }

    private void initParameters(Camera.Parameters param){
        previewSize = null;
        //計算預覽尺寸
        List<Camera.Size> previewList = param.getSupportedPreviewSizes();
        Collections.sort(previewList, new MyComparator());
        float screenScale = screenHeight/ (float)screenWidth;
        for (Camera.Size preSize : previewList) {
            Log.v("Demo", "----size:" + preSize.width + "x" + preSize.height);
            //GPU性能不太強的話,建議將預覽設置在120W以下
            if (preSize.width * preSize.height > 1200000) {
                continue;
            }
            float preScale = preSize.width / (float) preSize.height;
            float tag = Math.abs(preScale - screenScale);
            if (tag < 0.03) {
                previewSize = preSize;
                break;
            }
        }
        if (previewSize == null) {
            previewSize = previewList.get(0);
        }
        Log.v("Demo", "----Use size:" + previewSize.width + "x" + previewSize.height);
        param.setPreviewSize(previewSize.width, previewSize.height); // 設置預覽大小

        List<String> mSuportList = param.getSupportedFocusModes();
        if (mSuportList.contains(FOCUS_MODE_CONTINUOUS_PICTURE)) {
            param.setFocusMode(FOCUS_MODE_CONTINUOUS_PICTURE);
            autofocusType = FOCUS_MODE_CONTINUOUS_PICTURE;

        } else if (mSuportList.contains(Camera.Parameters.FOCUS_MODE_AUTO)) {
            param.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
            autofocusType = Camera.Parameters.FOCUS_MODE_AUTO;
        } else {
            autofocusType = NOT_AUTO_FOCUS;
        }
        param.setPictureFormat(PixelFormat.JPEG); // 設置圖片格式


        Camera.Size   mSize = camera.new Size(1280, 720);
        List<Camera.Size>  mSizeList = param.getSupportedPictureSizes();
        Collections.sort(mSizeList, new Comparator<Camera.Size>() { // 按支持的分辨率由大到小排序
            @Override
            public int compare(Camera.Size arg0, Camera.Size arg1) {
                if (arg0.width > arg1.width) {
                    return -1;
                } else if (arg0.width == arg1.width) {
                    if (arg0.height > arg1.height) {
                        return 1;
                    } else {
                        return -1;
                    }
                }
                return 1;
            }
        });
        for (Camera.Size size2 : mSizeList) {
            Log.i("ASDF", "Supported: " + size2.width + "x" + size2.height);
            if (mSize.width < size2.width) {
                continue;
            } else {
                mSize = size2;
                break;
            }

        }
        Log.i("ASDF", "Use : " + mSize.width + "x" + mSize.height);
        param.setPictureSize(mSize.width, mSize.height);
        param.setJpegQuality(80); // 設置照片質量
        if(isSurportFlash()) {
            setFlashOn(btn_flash.isSelected());
        }

        camera.setParameters(param);

    }

    private class MyComparator implements Comparator<Camera.Size> {
        @Override
        public int compare(Camera.Size size, Camera.Size size2) {
            return size2.width * size2.height - size.width * size.height;
        }
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        switch (keyCode) {
            case KeyEvent.KEYCODE_CAMERA: // 按下拍照按鈕
                if (camera != null && event.getRepeatCount() == 0) {
                    takePic();
                }
        }
        return super.onKeyDown(keyCode, event);
    }

    // 提供一個靜態方法,用於根據手機方向獲得相機預覽畫面旋轉的角度
    public static int getPreviewDegree(Activity activity) {
        // 獲得手機的方向
        int rotation = activity.getWindowManager().getDefaultDisplay()
                .getRotation();
        int degree = 0;
        // 根據手機的方向計算相機預覽畫面應該選擇的角度
        switch (rotation) {
            case Surface.ROTATION_0:
                degree = 90;
                break;
            case Surface.ROTATION_90:
                degree = 0;
                break;
            case Surface.ROTATION_180:
                degree = 270;
                break;
            case Surface.ROTATION_270:
                degree = 180;
                break;
        }
        return degree;
    }

    public static class ImageResource {
        public static int WHOLE_CAR = R.drawable.damage_whole_car1;
        public static int DAMAGE_FAR = R.drawable.damage_distant_scenery1;
        public static int DAMAGE_NEAR = R.drawable.damage_nearby_scenery1;
        public static int DAMAGE_DETAILS = R.drawable.damage_detail1;
        public static int INSURED_PESON_ID = R.drawable.certificate_identity_card1;
        public static int CAR_LICENSE = R.drawable.certificate_steer_license1;
        public static int DRIVER_LICENSE = R.drawable.certificate_driving_license1;
        public static int INSURED_PERSON_BANK_CARD = R.drawable.certificate_bank_card1;

        public static int get(int position) {
            switch (position) {
                case 0:
                    return WHOLE_CAR;
                case 1:
                    return DAMAGE_FAR;
                case 2:
                    return DAMAGE_NEAR;
                case 3:
                    return DAMAGE_DETAILS;
                case 100:
                    return INSURED_PESON_ID;
                case 101:
                    return CAR_LICENSE;
                case 102:
                    return DRIVER_LICENSE;
                case 103:
                    return INSURED_PERSON_BANK_CARD;
                default:
                    return WHOLE_CAR;
            }
        }
    }

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章