美文网首页
Camera1 采集

Camera1 采集

作者: android小奉先 | 来源:发表于2022-02-05 13:32 被阅读0次

本篇介绍

在Android上,Camera采集有Camera1,Camera2,CameraX三种接口,其中Camera1 在Android 21上已经被废弃了。不过由于这套接口可以在所有设备上兼容,还是最常用的接口。本篇介绍下该接口的使用。

Camera1 使用步骤

  1. 声明权限
    Camera是敏感操作,需要声明权限,在新版本中也需要动态声明。
 <uses-permission android:name="android.permission.CAMERA" />
  <uses-feature android:name="android.hardware.camera" />

代码中请求权限:

 private void requestPermission() {
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) {
            return;
        }
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, CAMERA_REQUEST_CODE);
    }
  1. 打开Camera
    比如现在是使用前置摄像头:
 Camera.CameraInfo info = new Camera.CameraInfo();
        int numCameras = Camera.getNumberOfCameras();
        for (int i =0; i < numCameras; i++) {
            Camera.getCameraInfo(i, info);
            if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
                mCamera = Camera.open(i);
                break;
            }
        }
        if (mCamera == null) {
            mCamera = Camera.open();
        }
  1. 设置参数
    设置旋转角度:
        int degree = 0;
        if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
            degree = info.orientation % 360 - 180;
        } else {
            degree = (info.orientation + 360) % 360;
        }
        mCamera.setDisplayOrientation(degree);
  1. 设置预览格式
 Camera.Parameters params = mCamera.getParameters();
        List<Integer> supportedFormat = params.getSupportedPreviewFormats();
        if (supportedFormat.contains(format)) {
            params.setPreviewFormat(format);
        }
        mCamera.setParameters(params);
  1. 设置预览画面尺寸:
int width_param = 0;
        int height_param = 0;
        double last_weight = Double.MAX_VALUE;
        Camera.Parameters params = mCamera.getParameters();
        List<Camera.Size> sizes = params.getSupportedPreviewSizes();
        for (Camera.Size size : sizes) {
            if (size.height == height && size.width == width) {
                width_param = size.width;
                height_param = size.height;
                break;
            }

            double weight = Math.pow(Math.abs(size.height - height),2) + Math.pow(Math.abs(size.width - width),2);
            if (weight < last_weight) {
                width_param = size.width;
                height_param = size.height;
            }
        }
        params.setPreviewSize(width_param, height_param);
        mCamera.setParameters(params);
  1. 设置帧率
int minFps_param = 0;
        int maxFps_param = 0;
        double last_weight = Double.MAX_VALUE;
        Camera.Parameters params = mCamera.getParameters();
        List<int[]> ranges = params.getSupportedPreviewFpsRange();
        for (int[] range : ranges) {
            if (range[0] <= minFps && range[1] >= maxFps) {
                minFps_param = range[0];
                maxFps_param = range[1];
                break;
            }

            double weight = Math.pow(Math.abs(range[0] - minFps),2) + Math.pow(Math.abs(range[1] - maxFps),2);
            if (weight < last_weight) {
                minFps_param = range[0];
                maxFps_param = range[1];
            }
        }
        params.setPreviewFpsRange(minFps_param, maxFps_param);
        mCamera.setParameters(params);
  1. 设置渲染,本篇使用SurfaceView渲染。
 mSurfaceView = findViewById(R.id.surface_view);
        mSurfaceView.getHolder().addCallback(new SurfaceHolder.Callback() {
            @Override
            public void surfaceCreated(@NonNull SurfaceHolder holder) {
            }

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

            @Override
            public void surfaceDestroyed(@NonNull SurfaceHolder holder) {
            }
        });
        mSurfaceView.setVisibility(View.VISIBLE);
        try {
            mCamera.setPreviewDisplay(mSurfaceView.getHolder());
        } catch (IOException e) {
            e.printStackTrace();
        }
  1. 开启预览:
mCamera.startPreview();

9: 销毁资源

 mCamera.stopPreview();
        try {
            mCamera.setPreviewDisplay(null);
        } catch (IOException e) {
            e.printStackTrace();
        }
        mCamera.release();

完整代码地址

相关文章

网友评论

      本文标题:Camera1 采集

      本文链接:https://www.haomeiwen.com/subject/haeukrtx.html