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;
            }
        }
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值