新API android.hardware.camera2
新旧API特点对比
Camera自定义相机
新API android.hardware.camera2自定义相机
Camera类被用于获取图片设置,start/stop 预览,快照图片,恢复视频编码的帧,Camera是一个client对于Camera Service来说,将管理Camera 硬件相关, 为了使用设备的camera, 须要在Manifest中加上相应的权限,如你须要自动聚焦功能,在Manifest.xml须加入
<uses-permission android:name=”android.permission.CAMERA” /><uses-feature android:name=”android.hardware.camera” /><uses-feature android:name=”android.hardware.camera.autofocus” />Camera拍照
用Camera去拍照,将遵循以下几个步骤:
获得一个Camera的实例,通过open方法
如果必要的话,可以修改一些默认参数
通过初始化SurfaceHolder去setPreviewDisplay(SurfaceHolder),没有Surface, camera不能开始预览
调用startPreview方法开始更新预览的surface,在拍照前,预览(preview)必须被开启。
当你想开始拍照时,使用takePicture(Camera.ShutterCallback, Camera.PictureCallback, Camera.PictureCallback, Camera.PictureCallback), 等待回调提供真实的图像数据
当拍完一张照片时,预览(preview)将会停止,当你想要拍更多的照片时,须要再一次调用startPreview方法
当调用stopPreview方法时,将停止更新预览的surface
当调用release方法时,将马上释放camera
Camera录像
以上是拍照过程,当如果切换成视频录制模式时,将遵循以下步骤:
获取一个初始化Camera,且开始预览
调用unlock方法允许media进程去访问camera
通过camera去setCamera(Camera),了解更多,可看MediaRecorder
当完成录制时,调用reconnect方法重新获取且重新lock camera
调用stopPreview()方法且release方法时,作为以上描述
这个类是一个非线程安全类,意味着在被使用任何工作线程中,大多数长运行操作(preview,focus,photo capture 等)发生,异步调用回调是必要的。回调被调用在事件线程,Camera方法决不能一次被多个线程调用
不同的安卓设备可能有不同的硬件规格,如像素的评级和自动对焦功能。
新API android.hardware.camera2
从API-21(5.0)开始,新增一个android.hardware.camera2包,取代原来Camera.java。
Android平台支持拍照及录制视频,通过android.hardware.camera2相关API或camera Intent,下面是一些相关联的类
android.hardware.camera2 主要的API控制相机设备,被用于拍照及拍视频当build一个camera应用时
Camera Android 5.0之前控制相机设备的class
SurfaceView 呈现实时预览给用户
MediaRecorder 用户录制视频
Intent Intent action类型:MediaStore.ACTION_IMAGE_CAPTURE/MediaStore.ACTION_VIDEO_CAPTURE,拍照或录视频,不用直接用Camera(可通过调起第三方定义的Camera)
本文出自逆流的鱼yuiop:
新旧API特点对比
android.hardware.camera2与原来的camera API相比,不同之处在于:
原生支持RAW照片输出突发拍摄模式
制约拍照速度的不再是软件而是硬件。以Nexus 5为例,分辨率全开下Andorid L的连拍速度可达到30fps。
全自动控制快门、感光度、对焦、测光、硬件视频防抖等多种参数都被整合到了新的API内。
新的API中添加的手动控制功能列表:感光度手动对焦/AF开关AE/AF/AWB模式AE/AWB锁硬件视频防抖连续帧
可以用单个手指进行缩放
支持QR码识别
实例
使用Camera有两种方式:通过Intent使用已有的app和通过Camera构建自己的app。通过Camera API的方式拍照。
通过Camera API方式拍照需要引入几个关键的类:
Camera类:最主要的类,用于管理Camera设备,本文中主要用到以下方法:
open():通过open方法获取Camera实例。
setPreviewDisplay(SurfaceHolder):设置预览拍照
startPreview():开始预览
stopPreview():停止预览
release():释放Camera实例
takePicture(Camera.ShutterCallback shutter, Camera.PictureCallback raw, Camera.PictureCallback jpeg):这个是拍照要执行的方法,包含了三个回调参数。Shutter是快门按下时的回调,raw是获取拍照原始数据的回调,jpeg是获取经过压缩成jpg格式的图像数据。在本文中需要实现最后一个回调,参见下面。
Camera.PictureCallback接口:该回调接口包含了一个onPictureTaken(byte[]data, Camera camera)方法。在这个方法中可以保存图像数据。
SurfaceView类:用于控制预览界面
SurfaceHolder.Callback接口:用于处理预览的事件,需实现如下三个方法:
surfaceCreated(SurfaceHolderholder):预览界面创建时调用,每次界面改变后都会重新创建,需要获取相机资源并设置SurfaceHolder。
surfaceChanged(SurfaceHolderholder, int format, int width, int height):预览界面发生变化时调用,每次界面发生变化之后需要重新启动预览。
surfaceDestroyed(SurfaceHolderholder):预览销毁时调用,停止预览,释放相应资源。
通过Camera方式来实现拍照
通过Camera方式 会比通过Intent方式获得更为丰富的功能。通常创建一个定制化的Camera需要如下步骤:
(1) 通过Camera.open()来获取Camera实例。 (2) 创建Preview类,需要继承SurfaceView类并实现SurfaceHolder.Callback接口。 (3) 为相机设置Preview (4) 构建一个Preview的Layout来预览相机; (5) 为拍照建立Listener以获取拍照后的回调; (6) 拍照并保存文件; (7) 释放Camera。
本文出自逆流的鱼yuiop:
Camera自定义相机
CameraSample代码如下: MainActivity.java
每个人都有自己鲜明的主张和个性,