android camera2
|
1、camera2api的部分描述: |
api地址:https://developer.android.com/reference/android/hardware/camera2/package-summary.html 用于捕捉相机图像或从相机中捕捉到的图像的摄像机的配置捕捉会话 |
| CameraCaptureSession.CaptureCallback |
用于跟踪提交给相机设备的CaptureRequest进程的回调对象。 |
| CameraCaptureSession.StateCallback | 一个回调对象,用于接收关于摄像机捕获会话状态的更新。 |
| CameraCharacteristics |
描述一个摄像机的属性。 |
| CameraCharacteristics.Key<T> | 相机特性 |
| CameraConstrainedHighSpeedCaptureSession | 一种受限的高速捕获通道,用于捕捉高速视频记录用例的高速图像。 |
| CameraDevice |
这款相机是一款与Android设备相连的单机相机,可以在高帧率下对图像捕捉和后处理进行精细控制 |
| CameraDevice.StateCallback | 一个回调对象,用于接收有关相机设备状态的更新。 |
| CameraManager |
|
| CameraManager.AvailabilityCallback | 于摄像机设备的回调,描述相机可用或无法打开. |
| CameraManager.TorchCallback | 摄像机闪光灯模式的回调,即不可用、禁用或启用。 |
| CameraMetadata<TKey> | 相机控制和信息的基类 |
| CaptureFailure | 图像传感器捕获单个图像捕获失败. |
| CaptureRequest |
一个不可变的设置和输出包,需要从摄像机设备中捕获一个图像 |
| CaptureRequest.Builder | 构建器捕获请求 |
| CaptureRequest.Key<T> | 个键用于捕获请求字段查找 get(CaptureResult.Key) 或设置 set(Key, Object). |
| CaptureResult |
从图像传感器中捕获的单个图像的子集 |
| CaptureResult.Key<T> | 捕获结果字段 |
| DngCreator | dng主类提供了将原始像素数据写入DNG文件的功能。 |
| TotalCaptureResult |
从图像传感器中捕获的单个图像的总聚集结果 |
2、详见代码:
package com.admin.smartcam.androidcamera.camera2; import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
import android.graphics.SurfaceTexture;
import android.hardware.camera2.CameraAccessException;
import android.hardware.camera2.CameraCharacteristics;
import android.hardware.camera2.CameraDevice;
import android.hardware.camera2.CameraManager;
import android.hardware.camera2.CaptureRequest;
import android.media.CamcorderProfile;
import android.media.MediaRecorder;
import android.os.Build;
import android.os.Environment;
import android.support.annotation.RequiresApi;
import android.support.v4.app.ActivityCompat;
import android.view.Surface;
import android.view.TextureView;
import android.widget.Toast; import com.admin.smartcam.service.SmartCamService; import java.io.File;
import java.io.IOException;
import java.util.Arrays; import static android.content.Context.CAMERA_SERVICE;
import static com.admin.smartcam.service.SmartCamService.handler; /**
* Created by Admin on 2017/6/2 0002.
*/ @RequiresApi(api = Build.VERSION_CODES.ICE_CREAM_SANDWICH)
public class TextureViewPreview extends TextureView implements TextureView.SurfaceTextureListener {
private Context context;
private CameraManager cameraManager;
private CameraDevice cameraDevice;
public static CaptureRequest.Builder mPreviewBuilder;
public static MediaRecorder mMediaRecorder;
public TextureViewPreview(Context context) {
super(context);
this.context = context;
setSurfaceTextureListener(this);
} @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
@Override
public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int i, int i1) {
openCamera();
} @Override
public void onSurfaceTextureSizeChanged(SurfaceTexture surfaceTexture, int i, int i1) { } @Override
public boolean onSurfaceTextureDestroyed(SurfaceTexture surfaceTexture) {
return true;
} @Override
public void onSurfaceTextureUpdated(SurfaceTexture surfaceTexture) { } /**
* 第一步
*/
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
private boolean openCamera() {
cameraManager = (CameraManager) context.getSystemService(CAMERA_SERVICE);//获得相机服务
try {
String[] CameraIdList = cameraManager.getCameraIdList();
//获取可用相机设备列表
CameraCharacteristics characteristics = cameraManager.getCameraCharacteristics(CameraIdList[0]);
//在这里可以通过CameraCharacteristics设置相机的功能,须检查是否支持
characteristics.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL);
//就像这样
if (ActivityCompat.checkSelfPermission(context, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
return false;
}
try {
cameraManager.openCamera(CameraIdList[0], new CameraDevice.StateCallback() { @Override
public void onOpened(CameraDevice cameraDevice) {
startView(cameraDevice);
} @Override
public void onDisconnected(CameraDevice cameraDevice) {
cameraDevice.close();
} @Override
public void onError(CameraDevice cameraDevice, int i) {
cameraDevice.close();
}
}, handler); } catch (CameraAccessException e) {
e.printStackTrace();
}
return true;
} catch (CameraAccessException e) {
e.printStackTrace();
}
return true;
} /**
* 第二步
* 启动预览
*/
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
private void startView(CameraDevice cameraDevice) {
//setUpMediaRecorder();
SurfaceTexture surfaceTexture=this.getSurfaceTexture();
if (surfaceTexture!=null) {
Surface surface = new Surface(surfaceTexture);
try {
//预览请求
mPreviewBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
} catch (CameraAccessException e) {
e.printStackTrace();
}
mPreviewBuilder.addTarget(surface);
//mPreviewBuilder.addTarget(mMediaRecorder.getSurface());
try { cameraDevice.createCaptureSession(Arrays.asList(surface),
new AandroidCaptureSessionCallBack(), SmartCamService.handler);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}else Toast.makeText(context,"那个为空我也很无奈啊!", Toast.LENGTH_SHORT).show();
} /**
* 设置录像
**/
private void setUpMediaRecorder() {
mMediaRecorder = new MediaRecorder();
mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);
mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
mMediaRecorder.setProfile(CamcorderProfile.get(6));//设置分辨率为1080
mMediaRecorder.setOutputFile(initPath(getDate()).getAbsolutePath());
try {
mMediaRecorder.prepare();
//mMediaRecorder.start();
} catch (IOException e) {
e.printStackTrace();
}
} /**
* 获取系统当前时间
*
* @return
*/
private String getDate() {
String savedate = null;
savedate = System.currentTimeMillis() + ".mp4";
return savedate;
} /**
* 初始化保存路径
*/
private static File initPath(String saverPath) {
File filesd = new File(Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES), saverPath);//在SD
File file=Environment.getDataDirectory();//获取手机内存目录
if (saverPath.equals("")) {
if (!filesd.exists()) {
filesd.mkdirs();
}
}
return file;
}
}
package com.admin.smartcam.androidcamera.camera2; import android.hardware.camera2.CameraAccessException;
import android.hardware.camera2.CameraCaptureSession;
import android.hardware.camera2.CaptureRequest;
import android.os.Build;
import android.support.annotation.RequiresApi;
import android.widget.Toast; import com.admin.smartcam.main.MainActivity;
import com.admin.smartcam.service.SmartCamService; import static com.admin.smartcam.androidcamera.camera2.TextureViewPreview.mPreviewBuilder;
import static com.admin.smartcam.main.MainActivity.count; /**
* 第三步
* Created by Admin on 2017/4/23 0023.
* 将处理预览和拍照图片的工作
* 摄像头采集状态回调
*/ @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public class AandroidCaptureSessionCallBack extends CameraCaptureSession.StateCallback {
@Override
public void onConfigured(CameraCaptureSession cameraCaptureSession) {
try { mPreviewBuilder.set(CaptureRequest.CONTROL_AF_MODE,
CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
mPreviewBuilder.set(CaptureRequest.CONTROL_AE_MODE,
CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH); //cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
Toast.makeText(MainActivity.context,"AandroidCaptureSessionCallBack:>>>:"+count++, Toast.LENGTH_SHORT).show();
cameraCaptureSession.capture(mPreviewBuilder.build(),
new AndroidCaptureCallback(), SmartCamService.handler);//数据回掉接口
} catch (CameraAccessException e) {
e.printStackTrace();
}
} @RequiresApi(api = Build.VERSION_CODES.M)
@Override
public void onConfigureFailed(CameraCaptureSession cameraCaptureSession) {
// cameraCaptureSession.getInputSurface().lockCanvas(new Rect(1,1,1,11));
}
}
package com.admin.smartcam.androidcamera.camera2; import android.graphics.Bitmap;
import android.hardware.camera2.CameraCaptureSession;
import android.hardware.camera2.CaptureRequest;
import android.hardware.camera2.CaptureResult;
import android.hardware.camera2.TotalCaptureResult;
import android.os.Build;
import android.support.annotation.RequiresApi;
import android.util.Log; /**
* 第四步
* Created by Admin on 2017/4/23 0023.
* 包含两个状态,采集进行,采集完成
可以在这里面去做处理,
*数据回掉接口
*摄像头采集回话采集状态的回调
*/ @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public class AndroidCaptureCallback extends CameraCaptureSession.CaptureCallback {
//在onCaptureCompleted中处理数据
@Override
public void onCaptureCompleted(CameraCaptureSession session, CaptureRequest request,
TotalCaptureResult result) { int afState = result.get(CaptureResult.CONTROL_AF_STATE);
if (CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED == afState ||
CaptureResult.CONTROL_AF_STATE_NOT_FOCUSED_LOCKED == afState
|| CaptureResult.CONTROL_AF_STATE_PASSIVE_FOCUSED == afState
|| CaptureResult.CONTROL_AF_STATE_PASSIVE_UNFOCUSED == afState) {
//do something like save picture
Bitmap bitmap=(Bitmap) request.getTag();
Log.d("数据处理》》", String.valueOf(bitmap.getHeight()));
for (CaptureResult rs : result.getPartialResults())
{
rs.getFrameNumber();
}
}
} @Override
public void onCaptureProgressed(CameraCaptureSession session, CaptureRequest request,
CaptureResult partialResult) { } }
MainActivity.java
frameLayout = (FrameLayout) findViewById(R.id.camera_FrameLayout);
textureViewPreview = new TextureViewPreview(this);
//textureViewPreview.setAlpha(0.5f);//设置透明度 frameLayout.addView(textureViewPreview); 布局:
<FrameLayout
android:id="@+id/camera_FrameLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"> </FrameLayout>
android camera2的更多相关文章
- Android Camera2采集摄像头原始数据并手动预览
Android Camera2采集摄像头原始数据并手动预览 最近研究了一下android摄像头开发相关的技术,也看了Google提供的Camera2Basic调用示例,以及网上一部分代码,但都是在Te ...
- Android Camera2 拍照(三)——切换摄像头,延时拍摄和闪光模式
原文:Android Camera2 拍照(三)--切换摄像头,延时拍摄和闪光模式 一.切换摄像头 在前后摄像头之间切换,首先需要关闭之前打开的摄像头,关闭preview,之后重新打开新的摄像头,重新 ...
- Android Camera2 拍照(四)——对焦模式
原文:Android Camera2 拍照(四)--对焦模式 本篇将重点介绍使用Camera2 API进行手动对焦的设置,以及在手动对焦与自动对焦模式之间切换. 一.手动对焦响应事件 首先我们要实现点 ...
- Android Camera2拍照(一)——使用SurfaceView
原文:Android Camera2拍照(一)--使用SurfaceView Camera2 API简介 Android 从5.0(21)开始,引入了新的Camera API Camera2,原来的a ...
- Android Camera2 拍照(二)——使用TextureView
原文:Android Camera2 拍照(二)--使用TextureView 上一篇博文简单介绍了使用Camera2 API拍摄照片,并使用SurfaceView作为预览界面.实际上,相对于Surf ...
- android Camera2 API使用详解
原文:android Camera2 API使用详解 由于最近需要使用相机拍照等功能,鉴于老旧的相机API问题多多,而且新的设备都是基于安卓5.0以上的,于是本人决定研究一下安卓5.0新引入的Came ...
- Android Camera2 拍照入门学习
原文:Android Camera2 拍照入门学习 学习资料: 肾虚将军android camera2 详解说明 极客学院android.hardware.camera2 使用指南 Android 5 ...
- Android Camera2/HAL3
Android : Camera2/HAL3 框架分析 https://www.cnblogs.com/blogs-of-lxl/p/10651611.html Android : Camera之ca ...
- Android Camera2 预览功能实现
1. 概述 最近在做一些关于人脸识别的项目,需要用到 Android 相机的预览功能.网上查阅相关资料后,发现 Android 5.0 及以后的版本中,原有的 Camera API 已经被 Camer ...
- Android : Camera2/HAL3 框架分析
一.Android O上的Treble机制: 在 Android O 中,系统启动时,会启动一个 CameraProvider 服务,它是从 cameraserver 进程中分离出来,作为一个独立进程 ...
随机推荐
- spring bean的作用域和自动装配
1 Bean的作用域 l singleton单列:整个容器中只有一个对象实例,每次去访问都是访问同一个对象 默认是单列 l prototype原型: 每次获取bean都产生一个新的对象,比如Ac ...
- 工具-NuGet
1.添加下载后,会将文件添加到当前项目的引用和bin目录中 ORM是一种插件/组件,将对集合对象的操作映射为对关系型数据库的操作,这个映射是相互的 来自为知笔记(Wiz)
- 【java项目实战】dom4j解析xml文件,连接Oracle数据库
简单介绍 dom4j是由dom4j.org出品的一个开源XML解析包.这句话太官方.我们还是看一下官方给出的解释.例如以下图: dom4j是一个易于使用的.开源的,用于解析XML,XPath和XSLT ...
- h5-爆料view
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAdsAAABeCAIAAADkEim8AAAWAElEQVR4nO2d+1Nb55nHPbMz+1v+g/ ...
- jquery 弹窗插件 layer
jquery 弹窗插件 layer 官网:http://sentsin.com/jquery/layer/ 1 <!DOCTYPE html PUBLIC "-//W3C//DTD H ...
- BZOJ 2141 分块 线段树
思路: a[i] //By SiriusRen #include <cmath> #include <cstdio> #include <cstring> #inc ...
- POJ 3020 Hungary
一道建图题-- // by SiriusRen #include <cstdio> #include <cstring> using namespace std; #defin ...
- Python 函数(一)
定义一个函数 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明. 函数内容以冒号起始,并且缩进. return [表达式] 结束函数,选择性地返回一个值给调用方.不带表达式的retur ...
- 项目中解决实际问题的代码片段-javascript方法,Vue方法(长期更新)
总结项目用到的一些处理方法,用来解决数据处理的一些实际问题,所有方法都可以放在一个公共工具方法里面,实现不限ES5,ES6还有些Vue处理的方法. 都是项目中来的,有代码跟图片展示,长期更新. 1.获 ...
- VB.net 捕获项目全局异常
在项目中添加如下代码:新建窗口来显示异常信息. Namespace My '全局错误处理,新的解决方案直接添加本ApplicationEvents.vb 到工程即可 '添加后还需要一个From用来显示 ...