美文网首页android视频Android
Android Camera2学习笔记

Android Camera2学习笔记

作者: _飞翔的荷兰豆 | 来源:发表于2016-08-09 21:24 被阅读6393次

前言

自从Android 5.0之后,Android有了新的Camera Api,但是现在网上的资料很少,只有谷歌的官方示例以及SDK文档,一些相关的资料,但由于想做一个相机App,所以我决定研究这个Api。

在Camera2的Api中,将一个Camera Device比作管道,输入一个个请求,返回包含一些图像的元数据和一系列的图像缓冲,Camera Device对于一系列的请求是按顺序处理。

我们可以获取的Camera Device不止一个,可能会有许多个,现在大家基本上的手机都会有2个Camera Device,一个前置的和一个后置的,如果我们还在手机上连了其他的摄像头外设,我们可以获取的Camera Device就会更多了。

那么,我们要怎么获取这些Camera Device对象呢?在Android中内置了一个CameraManager的系统级服务,我们可以这样子轻松获取

CameraManager manager = (CameraManager) context.getSystemService(Context.CAMERA_SERVICE);

选择合适的相机

每个不同的Camera Device都包含有关于这个设备的一些特性参数,比如输出图像的大小,是否支持闪光灯等信息,这些信息都通过键值对的形式储存在CameraCharacteristics对象中,这个CameraCharacteristics对象由CameraManager管理,根据每只Camera Device的Id获取

for (String cameraId : cameraManager.getCameraIdList()) {
    CameraCharacteristics characteristics = cameraManager.getCameraCharacteristics(cameraId);
}

当获取到CameraCharacteristics对象后,我们要根据需要使用的功能选择合适的相机。
比如是否需要闪光灯支持

 Boolean available = characteristics.get(CameraCharacteristics.FLASH_INFO_AVAILABLE);
mFlashSupported = available == null ? false : available;

是否为前置摄像头

 Integer facing = characteristics.get(CameraCharacteristics.LENS_FACING);

以及获取图片输出的尺寸和预览画面输出的尺寸

StreamConfigurationMap configurationMap = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);

if (configurationMap == null) continue;

//获取图片输出的尺寸
configurationMap.getOutputSizes(ImageFormat.JPEG);
//获取预览画面输出的尺寸,因为我使用TextureView作为预览
configurationMap.getOutputSizes(SurfaceTexture.class)

等等,都储存在CameraCharacteristics对象中,我们需要选择出符合我们条件要求的相机,并记录下相应的CameraId。

打开相机

获取了CameraId后,就可以根据CameraId打开相应的Camera,获取CameraDevice对象。

CameraManager manager = (CameraManager) mActivity.getSystemService(Context.CAMERA_SERVICE);
try {
    manager.openCamera(mCameraId, mStateCallback, mMainHandler);
} catch (CameraAccessException e) {
    e.printStackTrace();
}

查看API,openCamera需要三个参数


device-2016-07-31-215411.png

相关文章

网友评论

  • 眷卿三世:请问楼主遇没遇到过,拍照的时候需要在imgageReader的回调函数中重新开启camera,预览才能正常显示?如果不重新开启,预览界面就卡住了
  • 9df2a6e99159:哥们儿怎么解决预览拉伸的问题啊?还有横竖屏切换的时候拉伸变形的问题
    9df2a6e99159:@_Nightmare 我几乎是抄的官方的DEMO为啥官方的就可以啊:sob:
    _飞翔的荷兰豆:@海边的卡夫卡Fu 参考fotoapparat库中的实现
  • ink9979:怎样切换摄像头
  • Bugme:你好,我想问下,camera1中有两个回调函数是可以获取byte数据的,camera2是用什么回调函数获取?
  • InnerNight:我的app,一旦把屏幕横过来,显示的图像就旋转了90°,这要怎么解决?
    InnerNight:@飞翔的荷兰豆 谢谢
    _飞翔的荷兰豆:@InnerNight 在一开始要计算角度,对TextureView进行角度变换,具体可以参考https://github.com/googlesamples/android-Camera2Basic/blob/master/Application/src/main/java/com/example/android/camera2basic/Camera2BasicFragment.java 中的 configureTransform 方法

本文标题:Android Camera2学习笔记

本文链接:https://www.haomeiwen.com/subject/mwmdsttx.html