前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Camera1 采集

Camera1 采集

作者头像
一只小虾米
发布2022-10-25 16:34:09
3110
发布2022-10-25 16:34:09
举报
文章被收录于专栏:Android点滴分享Android点滴分享

本篇介绍

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

Camera1 使用步骤

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

代码中请求权限:

代码语言:javascript
复制
 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 比如现在是使用前置摄像头:
代码语言:javascript
复制
 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. 设置参数 设置旋转角度:
代码语言:javascript
复制
        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. 设置预览格式
代码语言:javascript
复制
 Camera.Parameters params = mCamera.getParameters();
        List<Integer> supportedFormat = params.getSupportedPreviewFormats();
        if (supportedFormat.contains(format)) {
            params.setPreviewFormat(format);
        }
        mCamera.setParameters(params);
  1. 设置预览画面尺寸:
代码语言:javascript
复制
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. 设置帧率
代码语言:javascript
复制
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渲染。
代码语言:javascript
复制
 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. 开启预览:
代码语言:javascript
复制
mCamera.startPreview();

9: 销毁资源

代码语言:javascript
复制
 mCamera.stopPreview();
        try {
            mCamera.setPreviewDisplay(null);
        } catch (IOException e) {
            e.printStackTrace();
        }
        mCamera.release();

完整代码地址

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-02-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 本篇介绍
  • Camera1 使用步骤
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档