Camera2App

Introduction: 厂商平台之相机模块:采用 android5.0 中 Camera2 api+MVP 模式开发的一个相机程序,包含拍照,录像,自动调焦,Zoom 调焦,暂停录像。
More: Author   ReportBugs   
Tags:

采用 android5.0 中 Camera2 api+MVP 模式开发的一个相机程序。

运行效果如下:

image


包含以下功能:

  • 拍照

  • 录像:单次录像,暂停与恢复录像。

  • 模式设置:自动调焦,闪关灯,手动调焦, zoom 调焦


采用的技术点:

  • Camera2 API:相机 API

  • soviewer.jar: 用于将多个视频合成一个视频

  • RxJava 和 RxAndroid: 异步线程和主线程通讯

  • Glide : 异步加载图片和视频


备注: 虽然 andorid 5.0 出现了 camera 2 API 特性,但各大 android 手机系统厂商对 camera 2 的支持力度不一致。 因此,实际开发中还应该通过判断运行手机对 camera2 支持力度来决定是否需要用回 camera 来开发相机。

Android Camera2 API 资料阅览

简介

Android 5.0 开始出现了新的相机 Camera 2 API,用来替代以前的 camera api。

Camera2 API 不仅提高了 android 系统的拍照性能,还支持 RAW 照片输出,还可以设置相机的对焦模式,曝光模式,快门等等。

Camera2 中主要的 API:

  • CameraManager 类 : 摄像头管理类,用于检测、打开系统摄像头,通过getCameraCharacteristics(cameraId)可以获取摄像头特征。

  • CameraCharacteristics 类:相机特性类,例如,是否支持自动调焦,是否支持 zoom,是否支持闪光灯一系列特征。

  • CameraDevice 类: 相机设备,类似早期的 camera 类。

  • CameraCaptureSession 类:用于创建预览、拍照的 Session 类。通过它的setRepeatingRequest()方法控制预览界面 , 通过它的capture()方法控制拍照动作或者录像动作。

  • CameraRequest 类:一次捕获的请求,可以设置一些列的参数,用于控制预览和拍照参数,例如:对焦模式,曝光模式,zoom 参数等等。

接下来,进一步介绍,Camera2 API 中的各种常见类和抽象类。

CameraManager 类

  CameraCharacteristics cameraCharacteristics =manager.getCameraCharacteristics(cameraId);

通过以上代码可以获取摄像头的特征对象,例如: 前后摄像头,分辨率等。

CameraCharacteristics 类

相机特性类

CameraCharacteristics 是一个包含相机参数的对象,可以通过一些 key 获取对应的 values.

以下几种常用的参数

  • LENS_FACING:获取摄像头方向。LENS_FACING_FRONT 是前摄像头,LENS_FACING_BACK 是后摄像头。

  • SENSOR_ORIENTATION:获取摄像头拍照的方向。

  • FLASH_INFO_AVAILABLE:获取是否支持闪光灯。

  • SCALER_AVAILABLE_MAX_DIGITAL_ZOOM:获取最大的数字调焦值,也就是 zoom 最大值。

  • LENS_INFO_MINIMUM_FOCUS_DISTANCE:获取最小的调焦距离,某些手机上获取到的该 values 为 null 或者 0.0。前摄像头大部分有固定焦距,无法调节。

  • INFO_SUPPORTED_HARDWARE_LEVEL:获取摄像头支持某些特性的程度。

    以下手机中支持的若干种程度:

    • INFO_SUPPORTED_HARDWARE_LEVEL_FULL:全方位的硬件支持,允许手动控制全高清的摄像、支持连拍模式以及其他新特性。

    • INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED:有限支持,这个需要单独查询。

    • INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY:所有设备都会支持,也就是和过时的 Camera API 支持的特性是一致的。

CameraDevice 类

CameraDevice 的reateCaptureRequest(int templateType)方法创建 CaptureRequest.Builder。

templateType 参数有以下几种:

  • TEMPLATE_PREVIEW :预览

  • TEMPLATE_RECORD:拍摄视频

  • TEMPLATE_STILL_CAPTURE:拍照

  • TEMPLATE_VIDEO_SNAPSHOT:创建视视频录制时截屏的请求

  • TEMPLATE_ZERO_SHUTTER_LAG:创建一个适用于零快门延迟的请求。在不影响预览帧率的情况下最大化图像质量。

  • TEMPLATE_MANUAL:创建一个基本捕获请求,这种请求中所有的自动控制都是禁用的(自动曝光,自动白平衡、自动焦点)。

CameraDevice.StateCallback 抽象类

该抽象类用于 CemeraDevice 相机设备状态的回调。

    /**
     * 当相机设备的状态发生改变的时候,将会回调。
     */
    protected final CameraDevice.StateCallback stateCallback = new CameraDevice.StateCallback() {
        /**
         * 当相机打开的时候,调用
         * @param cameraDevice
         */
        @Override
        public void onOpened(@NonNull CameraDevice cameraDevice) {

            mCameraDevice = cameraDevice;
            startPreView();
        }

        @Override
        public void onDisconnected(@NonNull CameraDevice cameraDevice) {

            cameraDevice.close();
            mCameraDevice = null;
        }

        /**
         * 发生异常的时候调用
         *
         * 这里释放资源,然后关闭界面
         * @param cameraDevice
         * @param error
         */
        @Override
        public void onError(@NonNull CameraDevice cameraDevice, int error) {
            cameraDevice.close();
            mCameraDevice = null;

        }
        /**
         *当相机被关闭的时候
         */
        @Override
        public void onClosed(@NonNull CameraDevice camera) {
            super.onClosed(camera);
        }
    };

CameraCaptureSession.StateCallback 抽象类

该抽象类用于 Session 过程中状态的回调。

public static abstract class StateCallback {

        //摄像头完成配置,可以处理 Capture 请求了。
        public abstract void onConfigured(@NonNull CameraCaptureSession session);

        //摄像头配置失败
        public abstract void onConfigureFailed(@NonNull CameraCaptureSession session);

        //摄像头处于就绪状态,当前没有请求需要处理
        public void onReady(@NonNull CameraCaptureSession session) {}

        //摄像头正在处理请求
        public void onActive(@NonNull CameraCaptureSession session) {}

        //请求队列中为空,准备着接受下一个请求。
        public void onCaptureQueueEmpty(@NonNull CameraCaptureSession session) {}

        //会话被关闭
        public void onClosed(@NonNull CameraCaptureSession session) {}

        //Surface 准备就绪
        public void onSurfacePrepared(@NonNull CameraCaptureSession session,@NonNull Surface surface) {}

}

资源参考

Apps
About Me
GitHub: Trinea
Facebook: Dev Tools