Android进阶——你所知道的Camera2和你所不知道的Camera2完全解析

Android进阶——你所知道的Camera2和你所不知道的Camera2完全解析,第1张

一切源于在项目过程中的一个Bug:我的需求是在MainActivity 实现自动预览,也可以点击跳到签到SignedActivity去实现拍照签到,第一次进入界面的时候都是正常的,但是有时候返回来的时候预览失败,即从MainActivity跳转到SignedActivity偶尔预览失败和从SignedActivity返回MainActivity偶尔失败,都是报(CAMERA_IN_USE)ERRO=1的错误,奇怪的是的的确确做了完全释放 *** 作,加上以前用的更多的是Camera api 对于Camer2 的机制没有完整去研究过,一下子懵了,于是乎先去找了Stack Overflow,查到一个解决方案是:"我弃用了新API,换回旧API",ORZ,找了其他的也没有答案,可是我不服呀,我就把官方的文档全部啃了一遍,于是乎便有了以下的理解,我想如果你不懂得怎么使用Camera2的话,这篇绝对值得你去阅读,你会发现Camera2 并非像大多数说得那样使用起来很复杂。

全新的androidhardwareCamera2 。Android 50对拍照API进行了全新的设计,新增了全新设计的Camera 2 API,这些API不仅大幅提高了Android系统拍照的功能,还能支持RAW照片输出,甚至允许程序调整相机的对焦模式、曝光模式、快门等。

在Camera2 架构在核心参与类角色有: CameraManager CameraDevice CameraCharacteristics CameraRequest与CameraRequestBuilder CameraCaptureSession 以及 CaptureResult

位于androidhardwarecamera2CameraManager下,也是Android 21(50)添加的,和其他系统服务一样通过 ContextgetSystemService(CameraManagerclass ) 或者 ContextgetSystemService(ContextCAMERA_SERVICE) 来完成初始化,主要用于管理系统摄像头

CameraDevice是Camera2中抽象出来的一个对象,直接与系统硬件摄像头相联系。因为不可能所有的摄像头都会支持高级功能(即摄像头功能可被分为limit 和full 两个级别),当摄像头处于limited 级别时候,此时Camera2和早期的Camera功能差不多,除此之外在Camera2架构中,CameraDevice还承担其他两项重要任务:

正如前面所说, 系统向摄像头发送 Capture 请求,而摄像头会返回 CameraMetadata,这一切都是在由对应的CameraDevice创建的CameraCaptureSession 会话完成 ,当程序需要预览、拍照、再次预览时,都需要先通过会话。(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 previouslyA CameraCaptureSession is created by providing a set of target output surfaces to createCaptureSession , or by providing an InputConfiguration and a set of target output surfaces to createReprocessableCaptureSession for a reprocessable capture session Once created, the session is active until a new session is created by the camera device, or the camera device is closed)CameraCaptureSession一旦被创建,直到对应的CameraDevice关闭才会死掉。虽然CameraCaptureSession会话用于从摄像头中捕获图像,但是只有同一个会话才能再次从同一摄像头中捕获图像。另外, 创建会话是一项耗时的异步 *** 作,可能需要几百毫秒 ,因为它需要配置相机设备的内部管道并分配内存缓冲区以将图像发送到所需的目标,因而createCaptureSession和createReprocessableCaptureSession会将随时可用的CameraCaptureSession发送到提供的监听器的onConfigured回调中。如果 无法完成配置,则触发onConfigureFailed回调 ,并且会话将不会变为活动状态。最后需要注意的是,如果 摄像头设备创建了一个新的会话,那么上一个会话是被关闭的,并且会回调与其关联的onClosed ,如果不处理好,当会话关闭之后再次调用会话的对应方法那么所有方法将会跑出IllegalStateException异常。关闭的会话清除任何重复的请求(和调用了stopRepeating()方法类似),但是在新创建的会话接管并重新配置摄像机设备之前,关闭的会话仍然会正常完成所有正在进行的捕获请求。简而言之,在Camera2中CameraCaptureSession承担很重要的角色:

描述Cameradevice属性的对象,可以使用CameraManager通过getCameraCharacteristics(String cameraId)进行查询。

CameraRequest代表了一次捕获请求, 而CameraRequestBuilder用于描述捕获的各种参数设置,包含捕获硬件(传感器,镜头,闪存),对焦模式、曝光模式,处理流水线,控制算法和输出缓冲区的配置。 ,然后传递到对应的会话中进行设置, CameraRequestBuilder则负责生成CameraRequest对象 。当程序调用setRepeatingRequest()方法进行预览时,或调用capture()方法进行拍照时,都需要传入CameraRequest参数。CameraRequest可以通过CameraRequestBuilder来进行初始化,通过调用createCaptureRequest来获得。

CaptureRequest描述是从图像传感器捕获单个图像的结果的子集的对象。(CaptureResults are produced by a CameraDevice after processing a CaptureRequest)当CaptureRequest被处理之后由CameraDevice生成。

CameraManager 处于顶层管理位置负责 检测获取所有摄像头及其特性 传入指定的CameraDeviceStateCallback回调打开指定摄像头 CameraDevice 是负责管理抽象对象,包括 监听Camera 的状态回调CameraDeviceStateCallback 创建CameraCaptureSession和CameraRequest CameraCaptureSession 用于描述一次图像捕获 *** 作,主要负责 监听自己会话的状态回调CameraCaptureSessionStateCallback CameraCaptureSessionCaptureCallback捕获回调 ,还有 发送处理CameraRequest CameraRequest 则可以看成是一个"JavaBean"的作用用于描述希望什么样的配置来处理这次请求;最后三个回调用于监听对应的状态。

CameraManager 处于顶层管理位置负责检测 检测获取所有摄像头并设置输出参数,传入指定的CameraDeviceStateCallback回调,然后打开指定摄像头,并触发CameraDeviceStateCallback中的onOpened方法,并在onOpened方法里开始通过调用创建预览会话, ,CameraDevice负责创建请求 CameraCharacteristics CameraRequest与CameraRequestBuilder CameraCaptureSession 以及 CaptureResult 则可以看成是一个JavaBean的作用用于描述以什么样的配置来处理这次请求。

Camera2Helper类只是简单的封装了下,为了让Camera2的初始化和Activity 高度分离,这个类只是Demo 阶段部分有待优化,另外结合我具体的业务,对于大小有限制,所以我都是默认采用采样压缩率方式对进行压缩

服务器端应用可以用java来做,在linux系统上安装jdk,tomcatserver,mysql数据库,返回给安卓端的数据用json格式或者xml格式,然后在安卓端解析这些数据,按照应用的规则来显示数据给用户就行了

Android以Java为编程语言,使接口到功能,都有层出不穷的变化,其中Activity等同于J2ME的MIDlet,一个Activity类(class)负责创建视窗(window),一个活动中的Activity就是在foreground(前景)模式,背景运行的程序叫做Service。

两者之间通过由和AIDL连结,达到复数程序同时运行的效果。如果运行中的Activity全部画面被其他Activity取代时,该Activity便被停止(stopped),甚至被系统清除(kill)。

扩展资料

Android应用程序是android系统智能手机的主要构成部分,实现了智能手机的多样性、多功能性,结合了办公功能、娱乐功能、生活实用功能等,广受人们的喜爱。

Android应用程序有很多,其中让人耳目一新的个性化实用性应用程序有:

MINT、CHROME、神奇阿莱西、SWYPE/SWiftKey键盘、SWYPE/SWiftKey键盘、Swype、POCKET阅读器、SNAPSEED、EYEINTHESKY天气、FLICKNOTE、LIGHTFLOW、ANYDO。

实现思维路径:

以进入相机拍照的思维路线为例子:

1进入app

2判断之前是否保存头像,如果有就显示历史图像 (下面代码中在getOldAvatar();方法中执行这个逻辑)

3点击更换图像的Button或者布局,启动对话框(下面代码中在dialogueBox();方法执行这个逻辑)

4系统版本判断授权方式(静态还是动态授权),判断之前是否已经授权 (setPermissions(Permissions_CAMERA_KEY);这个方法执行授权逻辑)

5如果是首次授权,就执行首次授权完成后马上运行的回调方法 onRequestPermissionsResult

5判断完成不管是否是首次授权还是之前就是授权过了都要执行enterCamera();方法启动相机并且发送携带数据的请求

6启动相机完成后,并且拍照完成退出相机,都要运行Intent返回数据请求回调方法onActivityResult。将传入的数据传入到cropPhoto(datagetData());方法里去执行剪裁。

7在cropPhoto方法里将携带数据跳转到裁剪界面中裁剪,裁剪完成后又要回到onActivityResult回调方法里,执行裁剪完的数据回调工作。

8在onActivityResult回调方法里,裁剪完的将运行setPicToView 方法保存。保存的将在下次启动activity时作为历史头像调用。

package comexamplelenovomydemoapp;

import androidappActivity;

import androidcontentIntent;

import androidcontentpmPackageManager;

import androidgraphicsBitmap;

import androidgraphicsBitmapFactory;

import androidgraphicsdrawableBitmapDrawable;

import androidgraphicsdrawableDrawable;

import androidnetUri;

import androidosBuild;

import androidosEnvironment;

import androidosStrictMode;

import androidproviderMediaStore;

import androidsupportannotationNonNull;

import androidsupportv4appActivityCompat;

import androidsupportv4contentContextCompat;

import androidsupportv7appAlertDialog;

import androidsupportv7appAppCompatActivity;

import androidosBundle;

import androidutilLog;

import androidviewLayoutInflater;

import androidviewView;

import androidwidgetImageView;

import androidwidgetLinearLayout;

import androidwidgetTextView;

import androidwidgetToast;

以上就是关于Android进阶——你所知道的Camera2和你所不知道的Camera2完全解析全部的内容,包括:Android进阶——你所知道的Camera2和你所不知道的Camera2完全解析、如何制作一个安卓app(过程)、如何android编程制作app等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/10107868.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存