Android 摄像头调用(不含拍照)

今天用到了调用摄像头
因为昨天不是在surfaceview上使用画布,而是使用摄像头
这里就总结自己代码和各位大牛的经验吧
使用摄像头 调用Camera要做的几个点分别是
设置尺寸、调整焦距、设置旋转角度
一开始先声明属性

    private SeekBar seekBar;        //进度条调整焦距
    private ImageView add,minus;    //按钮调整焦距
    private boolean haveCamera;     //是否有相机设备
    private int mCurrentCamIndex;   //相机的指数
    private int ROTATE;             //旋转值
    private int minFocus;           //当前手机默认的焦距
    private int maxFocus;           //当前手机的最大焦距
    private int everyFocus;         //用于调整焦距
    private int nowFocus;           //当前的焦距值

    private Camera camera;

使用getPackageManager().hasSystemFeature的方法查看是否有摄像头设备

 private boolean checkCameraHadware(){
        if(getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA))
            return true;
        else return false;
    }

打开前置摄像头的方法,先确定摄像头的个数,然后获取前置摄像头的id
用mCamera = android.hardware.Camera.open(camIdx)得到摄像头然后返回它

 private android.hardware.Camera openFrontFacingCameraGingerbread(){
        int cameraCount;         //摄像头个数
        Camera mCamera = null;   //声明相机变量
        Camera.CameraInfo cameraInfo = new Camera.CameraInfo(); //创建相机对象
        cameraCount = android.hardware.Camera.getNumberOfCameras();
        for(int camIdx = 0 ; camIdx < cameraCount ; camIdx++){
            Camera.getCameraInfo(camIdx,cameraInfo); //获取相机对象
            //判断是否前置摄像头
            if(cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT){
                try{
                    mCamera = android.hardware.Camera.open(camIdx); //打开前置摄像头
                    mCurrentCamIndex = camIdx;                      //设置前置摄像头id
                }catch (RuntimeException e){
                    Log.e(TAG,"相机打开失败:" + e.getLocalizedMessage());
                }
            }
        }
        return mCamera;
    }

设置旋转角度

 private void setCameraDisplayOrientation(Activity activity,int cameraId,Camera camera){
        Camera.CameraInfo info = new Camera.CameraInfo();
        Camera.getCameraInfo(cameraId,info);
        //获得旋转角度
        int rotation = activity.getWindowManager().getDefaultDisplay().getRotation();
        int degrees = 0;
        switch (rotation) {
            case Surface.ROTATION_0:          //没有旋转
                degrees = 0;
                break;
            case Surface.ROTATION_90:        //旋转90°
                degrees = 90;
                break;
            case Surface.ROTATION_180:       //180
                degrees = 180;
                break;
            case Surface.ROTATION_270:
                degrees = 270;
                break;
        }

        int result = 0;
        if(info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT){
            //前置摄像头旋转算法
            result = (info.orientation + degrees) % 360;
            result = (360 - result) % 360;
        }else{
            result = (info.orientation - degrees + 360) % 360;
        }
        ROTATE = result + 180;
        camera.setDisplayOrientation(result);        //设置拍摄角度
    }

然后设置焦距和打开的竖屏横屏

 private void setCamera(){
        if(checkCameraHadware()){
            camera = openFrontFacingCameraGingerbread();
            //设置摄像头方向调整摄像头旋转90度,成竖屏
            setCameraDisplayOrientation(this,mCurrentCamIndex,camera);
            Camera.Parameters parameters = camera.getParameters();
            parameters.setPictureFormat(ImageFormat.JPEG);
            List<String> list= parameters.getSupportedFocusModes();  //获取支持的对焦格式
            for(String str : list){
                Log.e(TAG,"支持的对焦模式:"+ str );
            }
            //手机支持的图片尺寸合集
            List<Camera.Size> pictureList = parameters.getSupportedPictureSizes();
            //手机支持的预览尺寸集合
            List<Camera.Size> previewList = parameters.getSupportedPreviewSizes();
            //设置为当前使用手机的最大尺寸
            parameters.setPictureSize(pictureList.get(0).width,pictureList.get(0).height);
            minFocus = parameters.getZoom();          //获得最小焦距
            maxFocus = parameters.getMaxZoom();
            everyFocus = 1;                           //每次增加及减少值
            nowFocus = minFocus;                      //当前焦距为最小值
            seekBar.setMax(maxFocus);                 //设置最大焦距
            Log.e(TAG,"当前镜头距离:" + minFocus + "\t\t获取最大距离:" + maxFocus); //日志打印
            camera.setParameters(parameters);

        }
    }

最后在surfaceview上打开摄像头
使用了 camera.setPreviewDisplay(holder)来打开
camera.setPreviewCallback(null)、 camera.stopPreview()来关闭

  @Override
    public void surfaceCreated(SurfaceHolder holder) {
        Log.e("surfaceCreated","绘制开始");
        try{
            setCamera();
            camera.setPreviewDisplay(holder);
        } catch (IOException e) {
            camera.release();
            camera = null;
            e.printStackTrace();
        }
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        Log.e("surfaceChanged","绘制改变");
        try{
            camera.stopPreview();
            camera.setPreviewDisplay(holder);
            camera.startPreview();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
         Log.e("surfaceDestroyed","绘制结束");
         camera.setPreviewCallback(null);
         camera.stopPreview();
         camera.release();
         camera = null;
    }

还有其中对seekbar和buttom的调焦操作

//设置相机参数
    private void setZoomValues(int want){
        Camera.Parameters parameters = camera.getParameters(); //获得相机参数
        seekBar.setProgress(want);           //设置进度
        parameters.setZoom(want);            //设置焦距参数
        camera.setParameters(parameters);    //设置相机参数,焦距
    }

    //获取相机参数和当前焦距
    private int getZoomValues(){
        Camera.Parameters parameters = camera.getParameters();
        int values = parameters.getZoom();
        return values;
    }

    //调节焦距
    //添加
    private void addZoomValues(){
        if(nowFocus > maxFocus){
            Log.e(TAG,"大于maxFocus是不可能的");
        }else if(nowFocus == maxFocus){
        }else {
            setZoomValues(getZoomValues() + everyFocus);
        }
    }

    //缩小
    private void minusZoomValues(){
        if(nowFocus < minFocus){
            Log.e(TAG,"小于minFocus是不可能的");
        }else if(nowFocus == minFocus){
        }else {
            setZoomValues(getZoomValues() - everyFocus);
        }
    }

    public void onProgressChanged(SeekBar seekBar,int progress,boolean fromUser){
        Camera.Parameters parameters = camera.getParameters();
        nowFocus = progress;
        parameters.setZoom(progress);
        camera.setParameters(parameters);
    }
public boolean onTouch(View v, MotionEvent event){
        switch (v.getId()){
            case R.id.add:
                addZoomValues();     //放大焦距
                break;
            case R.id.minus:
                minusZoomValues();   //缩小焦距
                break;
            case R.id.picture:
                break;
            default:
                break;
        }
        return true;
    }

猜你喜欢

转载自blog.csdn.net/rikkatheworld/article/details/79922212