相机基础原理

20 篇文章 2 订阅

相机基础

概念

Camera是系统对外提供控制手机摄像头的类

  • Camera1 谷歌出的第一代相机API,布局 SurfaceView
  • Camera2 Android 5.0对拍照API进行了全新的设计,功能会更精细,支持RAW照片输出,甚至允许程序调整相机的对焦模式、曝光模式、快门等,但是跟camera1 不兼容。布局: TextureView

详细参考:Camera1与Camera2区别
Camera2完全解析

SurfaceView, GlSurfaceView, TextureView 的区别

SurfaceView 出现最早, 解决类似视频播放的问题(可以用单独一个线程来渲染UI)。
后来发现用起来不方便, 渲染线程需要单独编写, 一大堆都可以独立成模板。
所以后来就出现了 GLSurfaceView, 概括一句话就是 使用了模板的 SurfaceView。
再后来发现GLSurfaceView不能根据屏幕的变化而变化, 这是由于GLSurfaceView同应用的Surface不是在同一层导致的问题。
人们就想到把这个GLSurfaceView弄到应用的Surface中, 所以就产生了TextureView.

SurfaceTexture,TextureView, SurfaceView和GLSurfaceView

相机启动流程

1. 权限申请

需要动态申请:android.permission.CAMERA

2. 调用前的准备工作

  • 获取相机所支持的摄像头
int numberOfCameras = Camera.getNumberOfCameras();// 获取摄像头个数
for (int cameraId = 0; cameraId < numberOfCameras; cameraId++) {
    Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
    Camera.getCameraInfo(cameraId, cameraInfo);        
    if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_BACK) {
        // 后置摄像头
    } else if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
        // 前置摄像头
    }
}
  • 其他可以配置类:CameraCharacter, Camera.Parameters 等

3. 初始化相机

  • 初始化Camera类
 mCamera = new Camera(this, isCamera2);
        mCamera.setCamera3aListener(this);
        mCamera.setCameraFocusListener(this);
        mCamera.setCameraPermissionListener(this);
        mCamera.setCameraPictureListener(this);
        mCamera.setCameraPreviewListener(this);
        mCamera.setCameraStatusListener(this);
        mCamera.setCameraZoomListener(this);
        //或者:mCamera.setSurface(surfaceView);
         mCamera.setSurface(textureView);

4. 开启相机

                mCamera.setPreviewSize(preview);
                        mCamera.setPictureSize(picture);
                        mCamera.startPreview();

5. 停止相机

   @Override
   protected void onPause() {
       super.onPause();
       Log.d(TAG, "onPause");
       mCamera.stopPreview();
   }

   @Override
   protected void onStop() {
       super.onStop();
       Log.d(TAG, "onStop");
       mCamera.closeCamera(mCamera.getCurrentCameraId());
   }

   @Override
   protected void onDestroy() {
       super.onDestroy();
       Log.d(TAG, "onDestroy");
       mCamera.release();
      }

参考

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值