android摄像头采集和预览-第一种方法

几种方法介绍

android摄像头采集和预览-几种方法介绍
http://blog.csdn.net/f562230829/article/details/78905530

第一种方法:

权限

开启摄像头需要在 AndroidManifest.xml 中添加摄像头权限 
<uses-permission android:name="android.permission.CAMERA"/>
注:高版本的手机,还需要动态申请

SurfaceView

1. 布局 xml 文件中
       <SurfaceView
        android:id="@+id/surfaceview"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" />
2. Activity的onCreate中
    mSurfaceView = (SurfaceView)findViewById(R.id.surfaceview);
    mSurfaceView.getHolder().addCallback(new SurfaceHolder.Callback() {
         @Override
         public void surfaceCreated(SurfaceHolder holder) {
         }
         @Override
         public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
         //打开摄像头
             CameraController.getInstance().openCamera(holder);
         }
         @Override
         public void surfaceDestroyed(SurfaceHolder holder) {
             CameraController.getInstance().closeCamera();
         }
     });

核心代码

    public boolean openCamera(SurfaceHolder surfaceHolder){
        boolean b = true;
        try {
            //打开摄像头
            int cameraId = openCommonCamera();
            //设置预览方式
            mCamera.setPreviewDisplay(surfaceHolder);
            //根据打开的摄像头获取旋转角度
            mDisplayOrientation = CameraUtils.getDisplayOrientation(cameraId);
            mCamera.setDisplayOrientation(mDisplayOrientation);
            //设置摄像头参数
            setPameras();
            //开始预览
            mCamera.startPreview();
        //获取预览数据
         mCamera.setPreviewCallbackWithBuffer(new Camera.PreviewCallback() {
            @Override
            public void onPreviewFrame(byte[] data, Camera camera) {
                //取出数据进行处理
                //...

                //将data重新设置给camera
                camera.addCallbackBuffer(data);
            }
        });
        byte[] data = new byte[mPreViewWidth * mPreViewHeight * 3 / 2];
        mCamera.addCallbackBuffer(data);
        }catch (Exception e){
            e.printStackTrace();
            b = false;
        }
        return b;
    }

    public static int getDisplayOrientation(int cameraId) {
        Camera.CameraInfo info = new Camera.CameraInfo();
        Camera.getCameraInfo(cameraId, info);
        int result;
        if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
            result = (info.orientation) % 360;
            result = (360 - result) % 360;  // compensate the mirror
        } else {  // back-facing
            result = (info.orientation + 360) % 360;
        }
        return result;
    }

    private void setPameras(){
        //选择支持的宽高
        Camera.Size preViewSize = CameraUtils.getOptimalPreviewSize(mCamera,mPreViewWidth,mPreViewHeight);
        Camera.Parameters parameters = mCamera.getParameters();
        parameters.setRotation(mRotation);
        //预览的图像格式,NV21都支持
        parameters.setPreviewFormat(ImageFormat.NV21);
        //设置预览宽高        parameters.setPreviewSize(preViewSize.width,preViewSize.height);

        int[] range = CameraUtils.adaptPreviewFps(mPreViewFps, parameters.getSupportedPreviewFpsRange());
        parameters.setPreviewFpsRange(range[0],range[1]);
        mPreviewSize = preViewSize;
    }

demo地址

ActivityDemo1为第一种方法

git@gitee.com:audiocn/androidCamera.git
https://gitee.com/audiocn/androidCamera.git

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值