android Camera操作类

public class CameraOperate {

    private static CameraOperate mCameraOperate;
    private Camera mCamera;
    private int mStatus = 0;
    private int mCameraId = -1;
    private int mSurfaceViewOrientation = 0;
    private int mPictureOrientation = 0;
    public static synchronized CameraOperate getInstance() {
        if (null == mCameraOperate) {
            mCameraOperate = new CameraOperate();
        }
        return mCameraOperate;
    }

    private CameraOperate() {

    }

    /**
     * 绑定相机实例
     */
    public void openCamera() {
        if (mCameraId <= -1) {
            int numberOfCameras = Camera.getNumberOfCameras();
            CameraInfo cameraInfo = new CameraInfo();
            for (int i = 0; i < numberOfCameras; i++) {
                Camera.getCameraInfo(i, cameraInfo);
                if (cameraInfo.facing == CameraInfo.CAMERA_FACING_BACK) {
                    mCamera = Camera.open(i);
                    mCameraId = i;
                }
            }
        } else {
            mCamera = Camera.open(mCameraId);
        }
    }

    /**
     * 绑定与当前摄像头相反的相机实例
     *
     * @param
     */

    public void changeCamera(SurfaceHolder holder) {
        int cameraCount = 0;
        int id = -1;
        CameraInfo cameraInfo = new CameraInfo();
        cameraCount = Camera.getNumberOfCameras();
        for (int cameraId = 0; cameraId < cameraCount; cameraId++) {
            Camera.getCameraInfo(cameraId, cameraInfo);
            if (mStatus == 0) {
                if (cameraInfo.facing == CameraInfo.CAMERA_FACING_FRONT) {
                    stopPreview();
                    stopCamera();
                    try {
                        mCamera = Camera.open(cameraId);
                        LogUtils.d("swl","android.os.Build.BRAND"+android.os.Build.BRAND);
                        if(android.os.Build.BRAND.endsWith ("Xiaomi") ) {
                            mCamera.setDisplayOrientation(270);
                        }else {
                            mCamera.setDisplayOrientation(90);
                        }
                        mCamera.setPreviewDisplay(holder);
                    } catch (IOException e) {
                        e.printStackTrace();
                        return;
                    }
                    mCamera.startPreview();
                    mCameraId = cameraId;
                    mStatus = 1;
                    break;
                }
            } else {
                if (cameraInfo.facing == CameraInfo.CAMERA_FACING_BACK) {
                    stopPreview();
                    stopCamera();
                    try {
                        mCamera = Camera.open(cameraId);
                        mCamera.setDisplayOrientation(90);
                        mCamera.setPreviewDisplay(holder);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    mCamera.startPreview();
                    mCameraId = cameraId;
                    mStatus = 0;
                    break;
                }
            }
        }
    }

    /**
     * 获取当前相机的
     * @return
     */
    public boolean isFrontCamera(){
        return mStatus == 1;
    }

    /**
     * 获取相机实例
     *
     * @return
     */

    public Camera getCameraInstance() {
        return mCamera;
    }

    /**
     * 释放Camera实例
     */
    public void stopCamera() {
        if (null == mCamera)
            return;
        try {
            mCamera.release();
            mCamera = null;
        } catch (Exception e) {
        }
    }


    /**
     * 设置相机属性(前后摄像头,闪光,聚焦,相片和预览尺寸)
     *
     * @param parmars
     */
    public void setParameters(Parameters parmars) {
        if (null == mCamera)
            return;
        try {
            mCamera.setParameters(parmars);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 绑定预览surfaceHolder
     *
     * @param holder
     * @throws IOException
     */
    public void setPreviewDisplay(SurfaceHolder holder) {
        if (null == mCamera)
            return;
        try {
            mCamera.setPreviewDisplay(holder);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 适配预览相片与surfaceView 的大小
     *
     * @param surfaceView
     */

    private void setupPreviewSize(SurfaceView surfaceView) {
        Parameters parameters = mCamera.getParameters();
        List<Size> sizes = parameters.getSupportedPreviewSizes();
        int width = surfaceView.getWidth();
        int height = surfaceView.getHeight();
        Size size = CameraSizeUntil.getOptimalPreviewSize(sizes, height, width);
        parameters.setPreviewSize(size.width, size.height);
        if (parameters.isZoomSupported()) {
            parameters.setZoom(0);
        }
        setParameters(parameters);
    }

    /**
     * 设置拍照相片尺寸
     *
     * @param context
     */
    private void setUpTakePictureSize(Context context) {
        Parameters parameters = mCamera.getParameters();
        List<Size> sizes = parameters.getSupportedPictureSizes();
        Size size = CameraSizeUntil.getOptimalTakePictrueSize(sizes);
        parameters.setPictureSize(size.width, size.height);
        mPictureOrientation = getTakePicRotation(context);
        parameters.setRotation(mPictureOrientation);
        setParameters(parameters);
    }

    /**
     * 开始预览照片
     */
    public void startPreview(Activity activity, SurfaceView surfaceView) {
        if (null == mCamera)
            return;
        setCameraDisplayOrientation(activity);
        setupPreviewSize(surfaceView);
        try {
            mCamera.startPreview();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 停止预览照片
     */
    public void stopPreview() {
        if (null == mCamera)
            return;
        try {
            mCamera.stopPreview();
        } catch (Exception e) {
        }
    }

    /**
     * 获取相机相片
     *
     * @param shutter
     * @param raw
     * @param jpeg
     */
    public void takePhoto(Context context, ShutterCallback shutter, PictureCallback raw, PictureCallback jpeg) {
        if (null == mCamera)
            return;
        setUpTakePictureSize(context);
        try {
            mCamera.takePicture(shutter, raw, jpeg);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 自动对焦
     *
     * @param cb
     */
    public void autoFocus(AutoFocusCallback cb) {
        if (null == mCamera)
            return;
        try {
            mCamera.autoFocus(cb);
        } catch (Exception e) {
            // TODO: handle exception
        }
    }

    /**
     * 增加CameraZoom
     *
     * @param value
     */
    public void addCameraZoom(int value) {
        Parameters parameters = mCamera.getParameters();
        if (!parameters.isZoomSupported())
            return;
        int maxzoom = parameters.getMaxZoom();
        int zoom = parameters.getZoom();
        if (zoom >= maxzoom)
            return;
        zoom += value;
        if (zoom > maxzoom)
            zoom = maxzoom;
        parameters.setZoom(zoom);
        setParameters(parameters);
    }

    /**
     * 相机反向
     */
    public void rebackCamera() {
        mCamera.startFaceDetection();
    }

    /**
     * 获取界面的角度
     *
     * @param activity
     */
    public int getDisplayRotation(Activity activity) {
        int rotation = activity.getWindowManager().getDefaultDisplay()
                .getRotation();
        switch (rotation) {
            case Surface.ROTATION_0:
                return 0;
            case Surface.ROTATION_90:
                return 90;
            case Surface.ROTATION_180:
                return 180;
            case Surface.ROTATION_270:
                return 270;
        }
        return 0;
    }

    /**
     * 设置相机的照片的选择角度
     *
     * @param activity
     */
    public void setCameraDisplayOrientation(Activity activity) {

        CameraInfo info = new CameraInfo();
        Camera.getCameraInfo(mCameraId, info);
        int degrees = getDisplayRotation(activity);
        int result;
        if (info.facing == CameraInfo.CAMERA_FACING_FRONT) {
            result = (info.orientation + degrees) % 360;
            result = (360 - result) % 360;
        } else {
            result = (info.orientation - degrees + 360) % 360;
        }
        mCamera.setDisplayOrientation(result);
    }

    /**
     * 判断拍照时相机的角度(不能适配全部机型)
     *
     * @param context
     * @return
     */

    private int getTakePicRotation(Context context) {
        if (null == mCameraOperate)
            return 0;
        CameraInfo info = new CameraInfo();
        Camera.getCameraInfo(mCameraId, info);
        int degree = mSurfaceViewOrientation;
        //if ((degree >= 0 && degree <=45)  || degree  >= 315 ) {
        // return info.orientation;
        //}
        int plusOrMinus = 1;
        if (1 == mStatus)
            plusOrMinus = -1;
        if (degree <= 315 && degree >= 225) {
            return Math.abs(info.orientation + plusOrMinus * 270) % 360;
        } else if (degree >= 45 && degree < 135) {
            return Math.abs(info.orientation + plusOrMinus * 90) % 360;
        } else if (degree >= 135 && degree < 225) {
            return Math.abs(info.orientation + plusOrMinus * 180) % 360;
        }
        return Math.abs(info.orientation) % 360;
    }

    /**
     * 设置手机拍照时手机的旋转角度
     *
     * @param orientation
     */
    public void setSurfaceViewOrientation(int orientation) {

        if (null != mCameraOperate) {
            mSurfaceViewOrientation = orientation;
        }
    }

    /**
     * 清除相机状态设置
     */
    public void cleanCameraOption() {
        mCameraId = -1;
        mStatus = 0;
    }

    public List<Size> getTakeSizes() {
        if (null != mCamera)
            return mCamera.getParameters().getSupportedPictureSizes();
        return null;
    }

    public float getPictureOrientation() {
        return mPictureOrientation;
    }

    public int getStatus() {
        return mStatus;
    }

    public void setCameraVoice(boolean camera) {
        try {
            mCamera.enableShutterSound(camera);
        } catch (Exception e) {

        }
    }

    public boolean canDisableSound() {
        return true;
    }



}


猜你喜欢

转载自blog.csdn.net/qq_38164867/article/details/78517044