Android开发中amera2 Preview使用详解

目录
  • 前言
  • 一、Camera2 Preview需要用到哪些模块
  • 二、各个模块的功能和之间的关系
    • 2.1 SurfaceTexture之SurfaceTextureListener
      • 2.1.1 首先看关于SurfaceTexture的说明
      • 2.1.2 SurfaceTextureListener的使用
    • 2.2 CameraManager
      • 2.2.1 CameraManager的作用
      • 2.2.2 使用CameraManager打开Camera
    • 2.3 CameraDevice之StateCallback
      • 2.3.1 StateCallback的作用
      • 2.3.2 StateCallback的示例代码
    • 2.4 CameraDevice之createCaptureSession
      • 2.4.1 新建CaptureRequest.Builder
      • 2.4.2 新建CameraDevice之createCaptureSession
      • 2.4.3 创建CaptureRequest
  • 小结

前言

Camera2是Android新的Camera框架,整体来讲Camera2为应用程序提供了许多标准接口,使更多的功能可以通过参数控制;但是,灵活的同时也带来了架构的复杂。本文通过讨论实现Camera2的Preview功能,来和大家一起探讨Camera2所用到的模块最小集合。

一、Camera2 Preview需要用到哪些模块

总结起来,用到了如下模块,

  • SurfaceTexture之SurfaceTextureListener
  • CameraManager
  • CameraDevice之StateCallback
  • CameraDevice之createCaptureSession
  • CaptureRequest.Builder、 CaptureRequest

二、各个模块的功能和之间的关系

下面详细分析这几个模块的功能和之间的关系,

2.1 SurfaceTexture之SurfaceTextureListener

2.1.1 首先看关于SurfaceTexture的说明

主要目的是接收camera preview的数据并在UI上显示。

Captures frames from an image stream as an OpenGL ES texture.
从图像流捕获帧, 作为OpenGL ES纹理.

The image stream may come from either camera preview or video decode. A android.view.Surface created from a SurfaceTexture can be used as an output destination for the android.hardware.camera2, android.media.MediaCodec, android.media.MediaPlayer, and android.renderscript.Allocation APIs. When updateTexImage is called, the contents of the texture object specified when the SurfaceTexture was created are updated to contain the most recent image from the image stream. This may cause some frames of the stream to be skipped.

2.1.2 SurfaceTextureListener的使用

当与此Surface Texture关联的表面纹理可用时,可以使用此Listener来获得通知。
当收到SurfaceTexture可用通知的时候,执行初始化camera的动作。
示例代码如下,

private final SurfaceTextureListener mSurfaceTextureListener = new SurfaceTextureListener() {
        @Override
        public void onSurfaceTextureAvailable(@NonNull SurfaceTexture surface, int width, int height) {
            Log.i(TAG, "onSurfaceTextureAvailable: ++");
            try {
                Log.i(TAG, "onCreate: call initCamera()");
                initCamera();
            } catch (CameraAccessException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void onSurfaceTextureSizeChanged(@NonNull SurfaceTexture surface, int width, int height) {
            Log.i(TAG, "onSurfaceTextureSizeChanged: ++");
        }

        @Override
        public boolean onSurfaceTextureDestroyed(@NonNull SurfaceTexture surface) {
            Log.i(TAG, "onSurfaceTextureDestroyed: ++");
            return false;
        }

        @Override
        public void onSurfaceTextureUpdated(@NonNull SurfaceTexture surface) {
            Log.i(TAG, "onSurfaceTextureUpdated: ++");
        }
    };

2.2 CameraManager

2.2.1 CameraManager的作用

A system service manager for detecting, characterizing, and connecting to CameraDevices.
一种系统服务管理器,用于检测、表征和连接摄像设备。

2.2.2 使用CameraManager打开Camera

示例代码如下,

注意:
openCamera的第一个参数是打开哪一个摄像头,0代表后置摄像头;1代表前置摄像头;2代表外接摄像头。这里打开的是前置摄像头。
第二个参数是CameraDevice之StateCallback,稍后解析;
第三个参数是Handler,这里我们把Handler放在一个新创建的thread中;

CameraManager manager = (CameraManager) this.getSystemService(Context.CAMERA_SERVICE);
manager.openCamera("1", stateCallback, mBackgroundHander);

2.3 CameraDevice之StateCallback

2.3.1 StateCallback的作用

A callback objects for receiving updates about the state of a camera device.
用于接收相机设备状态更新的回调对象。

2.3.2 StateCallback的示例代码

我们会在onOpened()函数中创建Preview Session!


            CameraDevice.StateCallback stateCallback = new CameraDevice.StateCallback() {
                @Override
                public void onOpened(@NonNull CameraDevice camera) {
                    Log.i(TAG, "onOpened: ++");
                    mCameraDevice = camera;
                    createPreviewSession();
                }

                @Override
                public void onDisconnected(@NonNull CameraDevice camera) {
                    Log.i(TAG, "onDisconnected: ++");
                }

                @Override
                public void onError(@NonNull CameraDevice camera, int error) {
                    Log.i(TAG, "onError: ++");
                }
            };

2.4 CameraDevice之createCaptureSession

2.4.1 新建CaptureRequest.Builder

A builder for capture requests.

2.4.2 新建CameraDevice之createCaptureSession

A configured capture session for a CameraDevice, used for capturing images from the camera or reprocessing images captured from the camera in the same session previously.

2.4.3 创建CaptureRequest

An immutable package of settings and outputs needed to capture a single image from the camera device.

Contains the configuration for the capture hardware (sensor, lens, flash), the processing pipeline, the control algorithms, and the output buffers. Also contains the list of target Surfaces to send image data to for this capture.

这部分的示例代码如下,


    private void createPreviewSession() {
        SurfaceTexture surfaceTexture = mTextureView.getSurfaceTexture();
        // should be preview size, will got it later
        surfaceTexture.setDefaultBufferSize(mTextureView.getWidth(), mTextureView.getHeight());
        mImageReader = ImageReader.newInstance(mTextureView.getWidth(), mTextureView.getHeight(),
                ImageFormat.JPEG, /*maxImages*/2);

        Surface surface =new Surface(surfaceTexture);

        try {
            mPreviewRequstBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
            mPreviewRequstBuilder.addTarget(surface);

            mCameraDevice.createCaptureSession(Arrays.asList(surface, mImageReader.getSurface()),
                    new CameraCaptureSession.StateCallback() {
                        @Override
                        public void onConfigured(@NonNull CameraCaptureSession session) {
                            Log.i(TAG, "onConfigured: ");
                            if (mCameraDevice == null) {
                                return;
                            } else {
                                mCaptureSession = session;
                            }

                            mPreviewRequest = mPreviewRequstBuilder.build();
                            try {
                                mCaptureSession.setRepeatingRequest(mPreviewRequest, null, mBackgroundHander);
                            } catch (CameraAccessException e) {
                                e.printStackTrace();
                            }
                        }

                        @Override
                        public void onConfigureFailed(@NonNull CameraCaptureSession session) {
                            Log.i(TAG, "onConfigureFailed: ");
                        }
                    }, mBackgroundHander);
        } catch (CameraAccessException e) {
            e.printStackTrace();
        }
    }

小结

Camera2使用SurfaceTexture组件显示Preview视频流;
使用CameraManager打开CameraDevice之camera,同时塞入回调函数CameraDevice之StateCallback来反馈camera状态;
当Camera状况为Opened时,创建CaptureRequest.Builder为preview,并将surface关联至builder;之后创建CameraDevice之createCaptureSession,当收到onConfigured信息时,对诸如 sensor, lens, flash等进行配置,然后呼叫Builder的build函数完成配置CaptureRequest,最后设置session为repeat模式。

到此这篇关于Android开发中amera2 Preview使用详解的文章就介绍到这了,更多相关Android Camera2 Preview内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Android camera2 判断相机功能是否可控的实例

    Android Camera2 可调功能适配 首先获取到设备等级: Float hardwareLevel = mCameraCharacteristics.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL); LEGACY < LIMITED < FULL < LEVEL_3. 越靠右边权限越大 •INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY = 2 •INFO_SUPPORTED_HARDWAR

  • Android Camera2 实现预览功能

    1. 概述 最近在做一些关于人脸识别的项目,需要用到 Android 相机的预览功能.网上查阅相关资料后,发现 Android 5.0 及以后的版本中,原有的 Camera API 已经被 Camera2 API 所取代. 全新的 Camera2 在 Camera 的基础上进行了改造,大幅提升了 Android 系统的拍照功能.它通过以下几个类与方法来实现相机预览时的工作过程: •CameraManager :摄像头管理器,主要用于检测系统摄像头.打开系统摄像头等: •CameraDevice

  • Android Camera2采集摄像头原始数据

    最近研究了一下android摄像头开发相关的技术,也看了Google提供的Camera2Basic调用示例,以及网上一部分代码,但都是在TextureView等预览基础上实现,而我想要做的是在不预览的情况下,能获取到摄像头原始数据流,并由自己来决定是否绘制显示.经过一番折腾,初步实现了自己的目的-CamCap程序. 需求分析 其实主要就是在不预览的情况下获取到摄像头原始数据,目的嘛,一是为了灵活性,方便随时开启关闭预览,二是为了以后可以直接对数据进行处理,三是为了其他程序开发做一些准备.于是实现

  • Android实现Camera2预览和拍照效果

    简介 网上对于 Camera2 的介绍有很多,在 Github 上也有很多关于 Camera2 的封装库,但是对于那些库,封装性太强,有时候我们仅仅是需要个简简单单的拍照功能而已,因此,自定义一个 Camera 使之变得轻量级那是非常重要的了.(本文并非重复造轮子, 而是在于学习 Camera2API 的基本功能, 笔记之.) 学习要点: 使用 Android Camera2 API 的基本功能. 迭代连接到设备的所有相机的特征. 显示相机预览和拍摄照片. Camera2 API 为连接到 An

  • Android 用 camera2 API 自定义相机

    前言 笔者因为项目需要自定义相机,所以了解了一下 Android 关于 camera 这块的 API.Android SDK 21(LOLLIPOP) 开始已经弃用了之前的 Camera 类,提供了 camera2 相关 API,目前网上关于 camera2 API 介绍的资料比较少,笔者搜集网上资料,结合自己的实践,在这里做一个总结. 流程 因为 camera2 提供的接口比较多,虽然很灵活,但是也增加了使用的复杂度.首先来大致了解一下调用 camera2 的流程,方便我们理清思路. 要显示相

  • Android开发中amera2 Preview使用详解

    目录 前言 一.Camera2 Preview需要用到哪些模块 二.各个模块的功能和之间的关系 2.1 SurfaceTexture之SurfaceTextureListener 2.1.1 首先看关于SurfaceTexture的说明 2.1.2 SurfaceTextureListener的使用 2.2 CameraManager 2.2.1 CameraManager的作用 2.2.2 使用CameraManager打开Camera 2.3 CameraDevice之StateCallba

  • Android开发中的单例模式应用详解

    本文实例讲述了Android开发中的单例模式应用.分享给大家供大家参考,具体如下: 单例模式是应用最广的设计模式之一,在应用这种模式的时候,单例对象的类必须保证只有一个实例存在.许多时候,整个系统只需要拥有一个全局对象,这样有利于协调系统的整体行为.如一个应用中,应该只有ImageLoader实例,这个ImageLoader实例中又包含网络请求.缓存系统.线程池等,很耗资源,因此没有理由让他构造多个实例.这种不能自由构造对象的情况就是使用单例模式的场景.在Android系统中存在很多这种场景,比

  • Android开发环境搭建过程图文详解

    一.工具 IDE:Android Studio4.1+genymotion (Android studio 自带AVD着实有些不好用,这里选择使用genymotion模拟器) JDK:1.8 SDK:7.1 版本管理:Git 二.环境搭建 1.安装jdk 这里使用的是jdk1.8 ,安装并配置环境变量,通用步骤,不一 一介绍了 2.安装Android Studio 安装:android-studio-ide-201.6858069-windows.exe ,默认安装即可配置sdk (可以选择设置

  • Android 开发与代码无关技巧详解

    目录 1.如何找到代码 (1)无敌搜索大法 (2)log输出大法 (3)profiler查看大法 (4)万能法找到页面 2.如何解决bug (1)先看再想最后动手 (2)改变现状 (3)是技术问题还是业务问题 (4)张张嘴远胜于动动手 (5)bug解决不了,那就解决提出bug的人 (6)解决了bug之后 3.如何实现不会的功能 (1)不要急着拒绝 (2)大事化小小事化了 心态要稳,天塌了有个高的顶着 1.如何找到代码 作为客户端的开发,工作中经常遇到,后端的同事来帮忙找接口详情.产品经理来询问之

  • Android开发Activity的生命周期详解

    目录 前言 典型情况下的生命周期分析 前言 Android生命周期分为两部分: (1)典型情况下的生命周期. (2)异常情况下的生命周期. 典型情况下的生命周期分析 图1 Activity的生命周期图解 图2 Activity生命周期的金字塔图 (1)典型情况下的生命周期指在有用户参与的情况下,Activity所经过的生命周期的改变,正常情况下,Activity的常用生命周期有以下几种情况: onCreate():Activity启动后第一个被调用的函数,常用来进行Activity的初始化,如创

  • java开发中嵌套类的详解及实例

     java开发中嵌套类的详解 在java语言规范里面,嵌套类(Nested Classes)定义是: A nested class is any class whose declaration occurs within the body of another class or interface. A top level class is a class that is not a nested class. 说的简单一点,就是定义在类里面的类.一般把定义内部类的外围类成为包装类(enclos

  • Android 开发订单流程view实例详解

     Android 开发订单流程view实例详解 先看看最终效果图: 怎么样,效果还是很不错的吧?群里有人说切四张图的.recycleview的.各种的都有啊,但是最简单的就是通过自定义view来实现了-接下来让我们来实现下这个(订单流程view). 首先我们定义好我们的自定义属性: attrs.xml <?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleabl

  • 原生微信小程序开发中 redux 的使用详解

    前提 复杂场景中有不少数据需要在多个不同页面间来回使用和修改.但是小程序页面直接的数据通信方式十分的简单.通常情况需要自己维护一个全局的对象来存放共有数据.但是,简单的维护一个共有数据实体,会随着业务逻辑的不断复杂化而变的过分庞大,并且数据的修改往往无法很好的溯源.加之公共数据实体中数据的修改和页面的UI之间没有太好的同步手段,往往需要在页面和对应的数据实体中同时都维护一份相同的数据,操作十分的不方便. 之前使用过Taro以react+redux的结构来开发微信小程序,依托redux整体上可以解

  • C语言开发中的常见错误详解

    目录 一.编译型错误 1.解释 2.解决办法 3.代码示例 二.链接型错误 1.解释 2.解决办法 3.代码示例 三.运行时错误 1.解释 2.解决办法 3.代码示例 一.编译型错误 1.解释 编译型错误一般指语法错误,直接看错误信息或者是凭借着经验就可以搞定,相对来说较简单. 2.解决办法 双击错误提示信息,编译器就会自动定位发生错误的位置,按照正确的语法改正即可. 3.代码示例 正确代码: #include<stdio.h> int main() { int a = 10; int b =

  • 在Kotlin开发中如何使用集合详解

    关于 Kotlin 开发 使用 Kotlin 开发 Android App 在 Java 工程师群体中变得越来越流行.如果你由于某些原因错过了 Kotlin,我们强烈建议你看一下这篇文章. 对于那些处在技术前沿和喜欢 Kotlin 的开发者来说,本篇文章和他们息息相关.所以,下面就让我们来看一下怎样在 Kotlin 中使用集合吧. Kotlin中的集合是基于 Java 集合的框架.本篇文章主要讲的是 kotlin.collections 包中的几个特性. 数据处理 Kotlin 中有一个拓展函数

随机推荐