Android自定义相机_camera

来源:互联网 发布:疯狂的java讲义百度云 编辑:程序博客网 时间:2024/05/16 15:02

Android自定义camera

最近公司需要自定义camera,然后就查询了一些资料,仅供大家参考。

1.创建

这里自定义camera是基于SurfaceView写的,实现SurfaceHolder.Callback接口,

在surfaceCreated 中去打开相机,默认是打开前摄像头,在Android手机适配上这容易出现问题,还没找打解决方案

@Override    public void surfaceCreated(SurfaceHolder holder) {        mCamera = Camera.open(CameraInfo.CAMERA_FACING_BACK);    }

2.预览

 @Override    public void surfaceChanged(SurfaceHolder holder, int format, int width,                               int height) {        doStartPreview(mSurfaceHolder);    } 

具体的实现方法

public void doStartPreview(SurfaceHolder holder) {        if (isPreviewing) {            mCamera.stopPreview();            return;        }        if (mCamera != null) {            List<Camera.Size> mSupportedPreviewSizes = mCamera.getParameters().getSupportedPreviewSizes();            DisplayMetrics displayMetrics = mContext.getResources().getDisplayMetrics();            Camera.Size mPreviewSize = CameraSize.getOptimalSize(                    mSupportedPreviewSizes,                    displayMetrics.widthPixels,                    displayMetrics.heightPixels            );            Camera.Parameters mParams = mCamera.getParameters();            mParams.setPictureFormat(PixelFormat.JPEG);            mParams.setPictureSize(mPreviewSize.width, mPreviewSize.height); // 设置图片尺寸为手机接近匹配尺寸            mParams.setPreviewSize(mPreviewSize.width, mPreviewSize.height); // 设置预览尺寸为手机接近匹配尺寸            mCamera.setDisplayOrientation(90);            List<String> focusModes = mParams.getSupportedFocusModes();            if (focusModes.contains("continuous-video")) {                mParams.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO);            }            mCamera.setParameters(mParams);            try {                mCamera.setPreviewDisplay(holder);                mCamera.startPreview();            } catch (IOException e) {                e.printStackTrace();            }            isPreviewing = true;        }    }

主意设置预览和图片的尺寸,不然在预览和返回图片是会出现图片被拉伸的情况

设置的尺寸取的是接近手机尺寸

      mParams.setPictureSize(mPreviewSize.width, mPreviewSize.height); // 设置图片尺寸为手机接近匹配尺寸            mParams.setPreviewSize(mPreviewSize.width, mPreviewSize.height); // 设置预览尺寸为手机接近匹配尺寸

3.view销毁

在这要 执行这个方法,不然会报错

  @Override    public void surfaceDestroyed(SurfaceHolder holder) {        doStopCamera();    }    public void doStopCamera() {        if (null != mCamera) {            mCamera.setPreviewCallback(null);            mCamera.stopPreview();            isPreviewing = false;            mCamera.release();            mCamera = null;        }    }

有参考网上的几篇文章,可是忘了收藏,在此谢过
项目源码https://github.com/AlanPanYun/CustomCamera1